2010-06-15 54 views
2

它看起來像使用PHP腳本時遇到了典型的內存中斷問題。在「大」文件創建中降低腳本內存使用率

該腳本最初由其他人開發,可作爲XML站點地圖創建者,在大型網站上使用相當多的內存。

我認爲這個問題是由於算法在內存中保存的數據,直到作業完成,但挖到代碼,我發現腳本以這種方式工作有關:

  • 打開的文件中輸出(將包含XML網站地圖的條目)在環路
  • : ----用於向網站地圖被添加的每個條目,不使用fwrite
  • 關閉文件

儘管內存中沒有巨大的數組或變量,但這種技術使用了大量的內存。

我認爲也許PHP在腳本末尾緩衝了fwrites和「沖洗」數據,所以我修改了代碼來關閉並打開每個第N條記錄的文件,但內存使用率仍然相同....我正在調試我的電腦上的腳本並觀察內存使用情況:當腳本執行運行時,內存分配增長。

是否有一種特殊的技術來指示PHP釋放未使用的內存,強制刷新緩衝區(如果有)?

感謝

回答

1

所以你正在尋找一個不是自己寫的大型PHP程序中的內存泄漏?在你沒有任何運氣的情況下檢查常見問題(加載大數據庫結果,而不是沖刷/關閉文件)後,我認爲你應該使用像XDEBUG(http://xdebug.org/)這樣的分析器,它可以幫助你識別內存問題。其他任何事情都只是在大部分時間猜測。我曾經有過這樣的經歷......

+0

我已經安裝了xdebug,但我很ch咽一個表現良好的IDE客戶端。記事本++也窒息:-)任何建議健壯(免費)的IDE客戶端?任何Dreamweaver CS3插件? – Riccardo 2010-06-15 16:29:57

+0

@Riccardo如果您使用xdebug作爲分析器,您需要一個可以分析xdebug生成的轉儲文件的程序。請參閱http://xdebug.org/docs/profiler#introduction列出的程序。我在Windows上使用xdebug,使用WinCacheGrind分析轉儲文件。 – Max 2010-06-15 16:41:18

+0

順便說一下,也許你應該尋找一個更嚴重的PHP IDE,我可以推薦PHP Eclipse或NetBeans,或者如果你不介意許可費,activestate komodo也是非常好的。據我所知,他們都可以使用xdebug作爲調試器(用於在PHP代碼中設置斷點等)。 – Max 2010-06-15 16:43:45

0

必須有一些地方的數據是從哪裏來的,好好看看每個條目在站點地圖部分代碼被添加。這可能是一次巨大的數據庫記錄集,或其他類似的東西。

無論如何,爲了解決這個問題,如果你從數據庫加載數據,試着限制結果數量,然後在數據集之後循環獲取數據。

+0

你排除一個奇怪的PHP文件管理技術?如果是的話,我會專注於別的地方。 是使用非緩衝呼叫從數據庫加載數據。 – Riccardo 2010-06-15 08:58:02

+0

嗯,我只是給你更多的地方看,因爲你告訴我們自己,你已經做了文件管理的東西(使用任何方法 - 沖洗可能是一個更好的方法,但最終結果是相同的) – 2010-06-15 09:10:00

0

要衝洗文件緩衝區,請使用fflush()http://ch.php.net/manual/en/function.fflush.php),並釋放分配給變量a unset()http://ch.php.net/unset)的空間應執行此操作。

你說你試圖在這個過程中關閉並重新打開文件,所以沖洗緩衝區肯定不是解決方案。爲什麼不向我們展示一些代碼,內存泄漏有時並不明顯?

+0

- The腳本太長,無法在此處發佈,超過600個字符的限制 您會在哪裏尋找?某些數組正在增長? – Riccardo 2010-06-15 09:14:10

+0

基本上可以。如果你使用任何XML庫,也許你應該重新檢查一下。正如mr.b告訴你的,還要確保你沒有從數據庫中加載擁抱部分。在使用MySQL時,PHP在查詢數據庫時加載大量數據,而不是在您獲取數據時(對於其他數據庫系統,我不知道)。只需列出目錄中的所有文件通常不會佔用太多內存,因此您必須使用一些特殊技術來創建站點地圖,這使得在沒有代碼的情況下發現錯誤有點複雜。您也可以暫時將其發佈到pastebin或類似的地方。 – svens 2010-06-15 09:45:41

1

更改XML文件的解析方式。我猜它正在將整個樹加載到內存中。

改爲使用event parser。我用這個處理了幾個GB的XML文件。

+0

我已經發布了代碼鏈接(http://pastebin.com/ZVf8vZ7z)......它似乎並沒有將整個地圖加載到內存中...... – Riccardo 2010-06-15 16:28:17