2010-07-21 72 views
4

我遇到了PHP Simple DOM DOM Parser的內存問題。我解析一個公平的大小的doc和需要跑下來DOM樹...PHP簡單的DOM Dom內存問題

1)我開始與整個文件:

$html = file_get_html($file); 

2),然後分析出我的表:

$table = $html->find('table.big'); 

3),然後分析出我行:

$rows = $table[0]->find('tr'); 

什麼我結束了三個巨大的天體......任何人都知道^ h在我分析了我需要的數據之後轉儲對象?像$ html在第3步中沒用,但它是所有對象中最大的。

任何想法?

有沒有辦法深入到原始的$ html對象我的錶行?

在此先感謝。

編輯:

我已經成功地跳過步驟二用:

$rows = $this->html->find('table.big tr'); 

,但我仍然在運行到內存的問題......

+0

正如Aakash薩海提到的,你必須使用明確()清除內存。沒有它,我的腳本將使用大約140MB的內存,只有1.3MB! – stef 2012-08-15 09:30:36

回答

1

如果內存確實是一個大問題,你可能想看看SAX而不是使用DOM的。您可能希望獲得$table後試穿$htmlunset(),但畢竟是隻是簡單地將其標記爲垃圾回收和內存不會立即釋放。

在這一天結束,這是真的取決於你如何節省內存簡單的HTML DOM寫入或實現選擇。

0

...如何轉儲對象後,我已經 解析它爲我需要的數據?像 $ html ...

unset($html)

或​​可能會更好地工作 - 更即時的影響?

20

我可能會遲到...回答,因爲我加入了晚...所以上面給出的答案是不正確的。只取消設置$ html而不是其屬性。因此,要清理內存,並揭開序幕,內存問題是:

使用$html->clear();

我想你在使用它之前閱讀了類代碼。 clear()函數銷燬/釋放被$ html對象佔用的內存。該函數是simple_html_dom的內部函數。該函數立即生效。所以你不必等待整整一天或程序終止才能生效。

+0

在文檔中提到http://simplehtmldom.sourceforge.net/manual_faq.htm – stef 2012-08-15 09:20:09

+0

保存我的生活(literately:D) – ShiftyThomas 2013-11-19 17:27:50

2

您可以增加內存限制。

ini_set('memory_limit', '64M'); 

或與此代碼

$html->__destruct(); 
unset($html); 
$html = null; 
+0

在你的例子中,'$ html - > __destruct()'會拋出一個錯誤,因爲'$ html'不再是一個對象。 – Crontab 2014-01-24 00:15:33

+0

@Crontab你可以使用它們中的任何一個。 – 2014-01-24 07:43:22

+0

我的評論與你的訂單有關;你在'unset($ html);'之後調用了'$ html - > __ destruct()'**。那是錯誤的。你已經改變了它。最簡單的方法就是調用'$ html-> clear();'這個方法是由類開發人員編寫的,以處理這個確切的問題(如開發人員自己的社區中提到的那樣)。 – Crontab 2014-01-24 14:38:47