2013-04-09 91 views
0

我有一段時間的谷歌搜索,什麼都沒找到。PHP memcache內部對象

處理內部對象(如DOM或PDO)時,是否可以使用memcache來緩存它們?

我知道PDO可能不相關,因爲連接在腳本結束時被關閉 - 這可以更改爲持久連接 - 使緩存更可行?

但是,真正困擾我的是缺少關於是否有可能緩存DOM對象的內存中表示的文檔。 XML配置文件可能非常冗長,並且根據請求加載這些文件,構建DOM,可能會佔用大量服務器資源。

任何人都有緩存的經驗,特別是DOM對象?我是否應該選擇只重新解析DOM的PHP實現,初始化DOM並不是每個請求都必需的?

回答

0

您可以緩存PDO實例。您將不得不擴展PDO類並實施__wakeup__sleep魔術方法。

__sleep()方法將serialize()之前被調用,__wakeup期間unserialize()(它不是一種高精度當在手冊)。

您將使用__wakeup方法在Memcache反序列化之後重新建立連接。

我不認爲有很多興趣緩存PDO實例。

大多數核心對象不能被緩存。這是因爲它們沒有正確序列化。只有實現Serializable接口的類纔可以。

也許在某些情況下,它可以工作,如果該類只有公共屬性。

+0

我對緩存類似於數據庫連接(這是連接到第三方的東西)的擔心是,邏輯要弄清楚「連接是否存在」最有可能在構造函數中這種情況下)PDO類。這意味着,假設你對對象進行了非序列化,問題是...... unserialise()函數是否處理這些邊界情況?如果不這樣做,你會遇到令人討厭的驚喜。就我個人而言,我寧願不。你試圖緩存它的主要原因是什麼?你是否有足夠大的性能來緩存這樣的內容? – Sarel 2013-04-09 06:09:28

+2

serialize/unserialize函數不處理邊緣情況。你需要通過實現Serializable接口來定義你的對象是如何被序列化的,或者如果他們可以被正確地序列化,讓我們假設他們只有公共屬性,你將實現__wakeup方法來自己重新建立連接。我不認爲緩存PDO實例會帶來任何性能提升。您要緩存的是需要處理時間才能生成的大數據結構或大字符串。 – epicdev 2013-04-09 06:19:49

+0

我根本不應該提到PDO,因爲加載/解析大型XML文件的開銷,我的興趣在於緩存XML;無論它們是配置還是其他功能(如模板)的模板。 – 2013-04-09 14:20:35