2010-08-11 72 views
4

所以,我知道在PHP中的一般想法是整個應用程序加載和執行每次頁面加載。但爲了優化面向對象的PHP應用程序需要可移植... 是否有可能將一個對象加載到內存中,可以用於每個請求,而不是爲每個請求重新創建是'長壽命'的php對象嗎?

我見過使用$_SESSION這個變量的人,但看起來像這樣:a)醜陋,b)在服務器上佔用大量空間,c)沒有真正做到我需要它,因爲這是一個按會話排序的事情。

有沒有某種$_ALL_SESSIONS? ;)

(或者,從不同的角度接近的問題,是每一個你用標準的Apache MOD-PHP加載頁面時安裝加載到內存純粹的靜態對象)

回答

3

您或多或少正在尋找相當於ASP/IIS的Application object的PHP。 AFAIK沒有一個。

有EG(persistent_list),是一個「對象」列表,在請求提供後沒有(必然)刪除。它被諸如mysql_pconnect(),pg_pconnect()等函數使用,但它不能被腳本代碼直接訪問。

memchache已被提及。您能否詳細說明「純靜態物體」?

+0

那些不是對象,它們是資源。我知道你知道這一點,但只是簡單地引用引號並不能說明問題。而memcache實際上並不是OP正在尋找的內容,它只是另一種序列化/反序列化方法(儘管它是一種高效的方法)。 – Artefacto 2010-08-11 08:18:01

+0

@藝術品:不一定必須是(php)資源。 persistent_list似乎是一個「正常」的HashTable,所以它可以包含任何(php)值類型。但是,是的,* _pconnect函數存儲/檢索資源。 – VolkerK 2010-08-11 16:04:46

+0

你可以得到一個關於EG(persistent_list)文檔的鏈接(我認爲這只是用於擴展和內置函數......但我不介意寫一些C.) – 2010-08-15 22:08:16

3

也許你可以序列化和將它存儲在memcache中?我不知道這是否會更快。

+0

這只是堅持存儲一個對象跨請求,而不是對象本身(即它不能執行之間的任何執行請求,並且該類的代碼仍然需要加載每個請求,OP有興趣避免) – 2010-08-11 07:58:21

1

不是默認情況下,沒有。您必須使用一些解決方法,無論它是第三方工具(memcached,DBMS等)還是內置機制(會話,序列化爲文件等)是否比重新創建對象更快每條記錄都取決於你。

你也可以爲此寫一個PHP插件。 :)或者也許已經有一個。一個快速的谷歌搜索沒有透露,但我沒有很努力地嘗試。

如果你決定自己寫一個,那麼就知道它並不像聽起來那麼簡單。例如,Apache等網絡服務器產生了幾個子進程進程以並行處理請求。你必須很棘手才能將數據傳送給他們。更不用說正確的鎖定(如果請求掛起,並且鎖定中斷),處理網絡服務器集羣等。

+0

您可以使用PHP擴展來存儲跨請求的存儲,但這些不是PHP對象(如'$ a =新的stdclass')。 – Artefacto 2010-08-11 08:20:30

1

你可以做的是使用CLI的PHP版本來編寫一個'daemon'應用程序,該應用程序持久地存儲請求並維護狀態等,然後有一個常規的基於web的腳本,可以通過套接字或其他機制(here's one example

0

如果服務器是你自己的機器,那麼應​​該可以在後臺運行一個進程來做「全局事物」。您可以使用SOAP與它進行通信。

您只需要創建一個SOAP對象。

這是我看到真正爲php創建一個長壽命對象的唯一方法。其他一切都只是序列化。儘管如此,PHP之外可能還有一種技術。

老實說,我不認爲你的對象是足夠大和複雜的,因爲它被創建和填充的時間比它進行SOAP調用的時間要長。但是,如果創建這個對象需要大量的數據庫連接 - 這似乎是合理的,我的想法可以幫助...