2012-08-01 111 views
4

是否可以清除PHP中的所有資源?清除資源

我知道你可以通過get_defined_vars 獲得所有已定義的功能,但你可以很容易地清除這些資源。

但這對我來說還不夠。我有一個運行很長時間(〜1小時30分鐘)的腳本來執行許多功能..但執行時腳本收集的信息不再重要..腳本導出產品,並且每個約0.2MB - 0.5MB產品(3200產品)

這是超過600MB的內存使用量。我儘可能地優化了腳本,但我並沒有把它縮小。

我可以通過get_included_filesget_declared_classes獲得所有包含的文件;是否可以清除這些信息?刪除類(除了一些需要像自動裝載機類)或其他包括的文件,以便我可以釋放更多的RAM?

或者您知道其他方式來優化服務器使用情況嗎?

也許這是一個愚蠢的問題,但我會很高興爲每個提示提高PHP腳本的性能。

腳本環境的信息:該腳本運行在舊版Magento 1.4上,該緩存和性能存在嚴重問題;目前不可能更新到新版本。

+1

通常垃圾收集器足夠好,可以釋放任何未使用的引用本身,尤其是因爲它可以檢測自PHP5.3以來的循環引用。你真的達到了600MB? – KingCrunch 2012-08-01 14:48:03

+0

你是否將任何數據存儲在變量中的sql記錄?你可以嘗試寫入磁盤然後解除它們。 – JohnP 2012-08-01 14:50:00

+0

從它的聲音中,您想要在PHP腳本中間清除所有資源。我的建議是:不要。這聽起來像可能會導致可怕的事情(特別是因爲腳本可能仍然會與他們打交道)。相反,您應該進入代碼並關閉每個資源,因爲它不再需要。 – Palladium 2012-08-01 14:51:28

回答

2

我們有一個腳本消耗高達2GB的內存,並像瘋了一樣泄漏內存(它使用Doctrine 1.1)。

unset()ing儘可能多後,我們在劇本的頂部添加了gc_enable(),在戰略位置添加了gc_collect_cycles()

這確實有助於回收一些使用過的內存,但確實減慢了少量腳本的速度。

+0

聽起來不錯,我試試看。謝謝 – alphanyx 2012-08-02 07:51:23

1

該問題不依賴變量,但在算法中。

In think該腳本將所有值累加到一個大的「產品對象」數組中,該數組將在導出的文件中進行序列化。

要精通內存,最好在每次構建產品時序列化一次,而不是在序列化之前累積所有要導出到數組中的產品。

2

您已經有很多fonctions清晰的ressource /內存:

unset()可變

mssql_free_result爲SQL

memory_get_usage()的內存量,以字節爲單位,這是目前被分配到你的PHP腳本。

ETC ...

如果你混合一切,你可以減少內存/的ressource。