2008-10-23 49 views
6

我們有一個大型管理軟件,可以根據衆多的循環生成各種大型報告,包括數據庫檢索,對象創建(許多)等等。在PHP5中處理內存消耗的策略?

在PHP4上它可以快速運行,內存限制爲64 MB - 現在我們已經將它移動到一臺新的服務器上並且使用相同的數據庫 - 相同的代碼,相同的報表不會出現內存限制...

我知道PHP5已經在引擎蓋下改變了很多東西,但有沒有辦法讓它行爲?

最後的問題是,當你需要讓你的腳本節食時,你應用什麼策略?

回答

6

我們遇到的一個大問題是對象之間的循環引用,它們在超出範圍時阻止它們釋放內存。

根據您的體系結構,您可以使用__destruct()並手動取消設置任何引用。對於我們的問題,我最終重構了類並刪除了循環引用。

0

由於移動到新的服務器,你是否證實你的MySQL和PHP系統變量與他們在舊服務器上的方式相同?

PHP5引入了很多新功能,但是由於其向後兼容性口頭禪,我不相信PHP5和PHP4之間的差異應該會對應用程序的代碼和數據庫的性能造成如此大的影響被改變了。

您是否也在相同版本的Apache或IIS上運行?

這聽起來就像是更有可能涉及到新的系統環境,而不是從PHP4升級到5

0

貝特朗問題,

如果你有興趣在重構現有的代碼,然後我會建議您在執行報告時首先監視CPU和內存使用情況。你是否鎖定了你的SQL服務器,或者你是否鎖定了Apache(如果PHP代碼將很多壓力加入到系統中,會發生什麼?)?

我曾參與過一個項目,該項目最初陷入困境,因此我們不得不重構整個報表生成過程。然而,當我們完成加載後,只是轉移到Apache(通過更復雜的PHP代碼)。我們的最終解決方案是重構數據庫設計,以提供更好的報告功能性能,並使用PHP來彌補MySQL本身無法實現的功能。

根據報告的性質,您可能會考慮對報告中使用的數據進行非規範化處理。您甚至可以考慮構建第二個用作數據倉庫的數據庫,並且是圍繞OLAP原則而非OLTP原則設計的。您可以從Wikipedia開始,瞭解OLAP和數據倉庫的一般說明。然而,在你開始考慮嚴重的重構之前,你是否已經通過查看phpinfo()來驗證你的環境是非常相似的?適用於PHP和SHOW VARIABLES; 在MySQL?

0

演出!?!

甚至64MB很大。

忽略環境之間的差異(聽起來很奇特),這聽起來像代碼可能需要一些重新分解。

任何機會,你可以重新考慮你的代碼,以便數據庫查詢的結果集不會傾倒到數組中。我會建議你爲你的結果集構造一個迭代器。 (因此,您可以將它們作爲數組用於大多數目的)。一次處理一條記錄和一次處理10,000條記錄之間存在很大差異。

其次,看看你的代碼是在創建數據的多個實例。你能通過引用傳遞對象嗎? (使用'&')。在使用horde框架的早期變體時,我們必須做類似的事情。一個1 MB的附件會從衆多通過整個數據集作爲副本的調用中吹到50MB,而不是作爲參考。

+1

PHP5中的對象通過引用自動傳遞。 – grantwparks 2009-07-27 04:26:22