2010-11-25 50 views
3

如您所知,當您在SESSION中自動序列化存儲類定義時,並且在每個後續頁面上都將反序列化。我應該在SPEED會話中存儲我的PHP5對象,爲什麼?

我剛開始寫類,我想知道: 要存儲一個類在會話或文件與序列化是一個好主意?

如果是的話,我該如何儲存,然後GET使用PHP5中的班級?

回答

1

存儲對象實例有以下缺點:

  • 性能開銷:即使你不需要某些對象時,會去系列化和instatiated在每次請求。
  • 開發中的奇怪錯誤:無論何時添加或刪除對象的屬性,來自會話的實例都不會與對象定義匹配。
  • 安全:通常,會話數據與您的應用程序分開存儲。有時候這個位置不像其他文件那樣受到訪問保護和安全保護。
  • 數據重複和錯誤狀態:通過會話,您可以一次又一次地爲不同的用戶存儲相同的對象。與專用對象高速緩存相比,每個對象只存儲一次,這導致存儲需求增加,並且由於狀態在另一個會話中發生更改,因此對象具有錯誤狀態的可能性增加。

我寧願將對象存儲在專用的緩存中。查看Zend Cache類作爲一個好的緩存庫的例子。

如果你的對象使用資源(數據庫連接,文件,gd圖像),你的類應該實現接口Serializable。然後你必須添加兩個方法來完成清理和初始化工作。

2

您不會將類存儲在會話變量中,但可以存儲對象。請注意,如果您的對象具有引用資源(如文件句柄和數據庫連接)的屬性,則不會導致反序列化。

2

除非它是一個小班,可能不是(see this question for possible pitfalls with large sessions)。簡而言之,會話並不是設計成一個緩存機制,當你將它們合併爲一個時,它們表現得並不好。

請注意,如果您使用的是默認會話處理程序,則會話將存儲在硬盤驅動器上 - 當您收到許多併發請求時,會話速度不會很快。另外(測試和度量),序列化/反序列化可能比正常的對象創建方法慢 - 請注意,您可能會反序列化兩次:從會話到字符串,然後串入該類的對象。

如果您想要進行序列化/反序列化路由,請嘗試改爲Memcached。在會議

相關問題