2009-05-25 122 views
11

我是PHP的新手,但在其他Web技術中,您可以在頁面實例之間共享對象。例如,在java jsp頁面中,您可以輕鬆地將類存儲爲整個服務器實例的靜態類。如何在PHP中做到這一點?有沒有辦法在php頁面之間共享對象?

我不是指會話變量(至少我不這麼認爲)。這更多是爲了資源池(可能是共享套接字或數據庫連接等)。所以整個類需要在後續加載之間共享,而不僅僅是我可以存儲在會話中的一些原始變量。

我也研究過做單身人士的課程,但我相信課程只在同一頁面內共享,而不是跨頁面共享。

爲了讓事情更清楚,我正在尋找一些能夠幫助我分享連接到服務器的socket的connectSocket.php頁面,以便加載該頁面的所有用戶使用相同的套接字並且沒有打開一個新的。

回答

15

這是一個難以回答的問題,可能並不完全符合您的要求。

PHP建立在「無共享」架構之上。如果您的應用程序需要某種類型的狀態,則必須通過其他方式來完成此操作。

首先,我會建議調查問題的核心..你真的需要它嗎?如果您認爲PHP應用程序可能會死掉(並且丟失狀態),那麼可以丟失數據嗎?

如果您必須保持狀態,即使在應用程序死亡或其他情況下,您應該假設可能是將數據放在MySQL中的最佳位置。 PHP旨在作爲您業務邏輯的一個薄層,所以我可以強烈推薦這一點。

如果您不關心重新啓動後丟失數據,則您要查找的問題域可能是緩存。我會建議您查看memcached或者如果您在單臺機器上,apc。 APC肯定會在一臺機器上爲你工作,但是你仍然需要編寫你的應用程序,假設你可能會丟失數據。

如果您擔心您的基礎數據存儲(MySQL)速度太慢,但仍需要在重新啓動後維護數據,則應該考慮這兩個系統的組合。您始終可以從緩存中推送和提取數據,但只能在更新時將其發送到Mysql。

如果數據純粹是用戶或會話綁定的,您可能只想查看會話系統。

我已經親自開發了一個相當大的多租戶應用程序,雖然它是一個非常複雜的應用程序,但我從來不需要您尋找的真實狀態。

更新:抱歉,我沒有閱讀關於共享套接字的說明。你需要一個單獨的守護進程來處理這個問題,也許如果你可以進一步解釋你的問題,那麼可能還有其他方法。這是什麼類型的插座?

1

大多數PHP數據庫庫都使用連接池。例如,你可以調用pg_connect,就好像你正在請求一個新的連接一樣,但是如果連接字符串與已經存在的連接相同,那麼你將得到建立的連接。如果你只關心數據庫訪問池,那麼你可以確認它存在於你正在使用的數據庫庫中。

+1

儘管您的答案是正確的,但通常不推薦使用這些持久連接。創建新的連接通常非常便宜,這意味着您不必長時間保留所有連接。 作爲一個規則,我只在第一次查詢時才與db連接,並且儘快將其刪除。數據庫難以擴展,PHP要容易得多。 – Evert 2009-05-25 22:49:40

3

這可能是部分答案,但您可以將類的實例保存到Session變量並在另一次存取它。

+3

這不幸的是不能用於打開套接字。 – Evert 2009-05-25 22:47:55

12

Web服務的Java和Web服務的解釋型語言(如PHP和Perl)之間存在根本區別。在Java中,您的Web服務器將具有維護狀態的操作環境(即Tomcat)。使用解釋型語言,對Web服務器的請求通常會產生一個新的Web服務器線程,從而爲該線程(在本例中爲PHP環境)加載全新的操作環境。

因此,在PHP中,沒有頁面實例的概念。每個對Web服務器的請求都是全新的開始。所有的類都被重新加載,所以沒有類共享的概念,也沒有資源池的概念,除非它是在外部實現的。

因此,在Web請求之間共享套接字是不可能的。

+0

不正確,那麼memcache呢? – Pacerier 2014-10-18 16:04:46

0

另一個可怕的解決方案可能是將對象的數據加載到任何$ _SESSION變量,然後將其用回另一頁面的對象中。事實上,這是我將在我的項目中遵循的解決方案,直到我找到一個更好的解決方案。

問候!

相關問題