2011-11-17 88 views
5

如何在PHP中的不同會話之間創建共享對象?如何在PHP中的不同會話之間創建共享對象?

我在考慮使用文件或MySQL內存表。使用文件不是一個好的選擇,因爲它沒有鎖定並且速度很慢。使用MySQL內存表是一個不錯的選擇,但是如何將類實例(對象)保存到表中?序列化一個對象並放到表中也很慢。

Option 1: MySQL memory table 
Option 2: shm_attach,shm_detach,shm_get_var,shm_has_var,shm_put_var,.. 
Option 3: Memcache 

問題是使用MySQL的內存表需要查詢。 Memcache不包含在標準的PHP安裝中。要在Windows上具有shm_ *函數,需要使用選項「--enable-sysvsem」從源代碼構建PHP,並且這需要在php.ini中設置,開發人員可能無法一直訪問。

以上哪一項更好?任何其他選項?

+1

共享內存是一個選項:http://php.net/manual/en/function.shm-get-var.php –

+2

你在說什麼數據?這個「對象」是什麼樣的? – ManseUK

+0

它是一個具有多級結構的類的實例(類似於多級數組) – jondinham

回答

1

如果您想共享不同進程之間的對象(類的實例),無論使用哪種存儲層(數據庫,memchace,文件等),您都將始終綁定到serialize和。

如果你不想使用serializeunserialize,那麼你可以做的事情並不多。

+0

Marc B建議使用php信號量函數shm_ *,但這需要一個傳遞給php.exe的參數來啓用它。這是我可以在我的PC上執行的操作,但不是在共享的託管服務器上。即時通訊相當混亂 – jondinham

+0

@JonDinham,即使你使用文件你需要序列化的數據第一次是不是? – Pacerier

1

我記得在eyeOS的開發中看到了一個解決方案的類似問題。

我知道你並不是完全退出使用文件,但如果你想存儲你想以xml格式共享的變量。

如果您希望特定於某些會話,您可以爲每組會話使用唯一令牌(排序密碼),並設置一個控制器,根據令牌將請求發送到正確的會話xml文件。

爲了安全起見,您可以將xml信息存儲在php文件中,並且只允許使用正確的標記通過POST檢索信息。

此方法可讓您安全地訪問,編輯和刪除(銷燬)共享會話。

1

Memcache不在標準PHP安裝中。 信號量& Windows上不支持共享內存功能。

最有可能唯一的解決方案是使用MySQL內存表 與對象序列化。

1

我沒有看到APC提到:如果

http://www.php.net/manual/en/book.apc.php

不知道這是一個會話中的手動缺乏關於它做什麼,但其他職位我在替代memcache中看到任何信息。

我正在尋找一個類似的解決方案來存儲頁面模板,可能必須使用很多,並將認證用戶存儲在內存表中而不是使用php會話(第二部分我不太確定)。