2011-11-17 79 views
5

任何人都可以解釋在會話中存儲大量數據或指向某些閱讀的缺點嗎?會話:會話大小限制

如果在會話中存儲數據和從數據文件讀取數據之間存在差異,我也會感興趣嗎?

+0

請參閱http://stackoverflow.com/questions/4649907/maximum-size-of-a-php-session http://stackoverflow.com/questions/217420/ideal-php-session-size – Mob

+0

你已經曾在這裏。請停止簽署您的帖子(您的標題應該_描述問題_,而不是列出技術和主題) –

回答

4

如果您在會話中存儲了大量數據,由於會有大量的讀/寫操作,因此會導致輸入/輸出性能下降。

默認情況下,PHP中的會話存儲在/ tmp目錄中的平面文件中。因此,會話數據被寫入某種數據文件中。

PHP允許您通過session_set_save_handler()函數覆蓋其默認會話處理函數,您可以在其中重新定義會話讀/寫/維護的方式。

您也可以通過php.ini文件覆蓋此處,您可以通過session.save_handler指令指定它。

現在,大量會話存儲大量數據的含義是,將創建大量文件,並且由於硬盤驅動器的操作方式(機械硬盤驅動器的操作方式)需要一些時間才能找到它們仍然是常見的)。 你擁有的越多,找到它的時間就越長。它們越大,閱讀時間越長。如果你有很多這樣的人,而且他們很大 - 這是麻煩的兩倍,那麼需要改變方法。

那麼有什麼解決方案?

通常,當遇到性能下降 - 人們負載平衡他們的網站。這不會與會話不起作用,因爲負載平衡選擇使用哪臺計算機來處理當前請求。這意味着不同的電腦將爲您在某個網站上瀏覽的網頁提供服務。這意味着,如果這些計算機使用會話存儲的默認機制(/ tmp目錄),則會話將不會保留在服務器中,因爲它們無法訪問彼此的/ tmp目錄。 您可以通過安裝NAS並使其對羣集中的所有計算機全局可見來解決此問題,但這樣既昂貴又難以維護。

另一種選擇是將會話存儲在數據庫中。數據庫可以從我們的虛擬羣集中的任何計算機訪問。通常,有專門的數據庫用於處理會話,專門從存儲網站內容的數據庫中分離出來。 在NoSQL受歡迎的時代 - 在我看來,NoSQL非常適合處理會話。它們可以輕鬆擴展,它們比RDBMS更快地將數據寫入存儲設備。

第三個選擇是提升所有這些,將硬盤作爲永久性存儲解決方案,並僅使用服務器的內存來存儲會話。 你得到的是令人難以置信的性能,但是你的內存可能會很快消失。 您也可以創建一個將會話存儲在RAM中的計算機集羣。 Redis和Memcache非常適合這項任務,使用googling會爲您提供很好的資源,解釋如何使用Redis或Memcache來存儲會話。

所有這些的底線是:不要在會話中存儲太多數據。 根據您的需求和預算 - 有3個選項可用於如何存儲和使用會話。

1

這是一個很好的鏈接:http://tuxradar.com/practicalphp/10/1/0

會話數據是非常昂貴的工作量太大。做到這一點的最佳方式是存儲cookie或session_id,並使用它從dbfile/rdbms中查找所需的內容。這還允許您的站點跨多服務器環境運行,因爲會話數據僅限於單個環境。