phpQuery による過剰なメモリ使用量に対処する方法
phpQuery がメモリを大量に消費する問題を解決する
phpQuery は、php で実装された jQuery に似たオープン ソース プロジェクトで、サーバー側で jQuery 構文の Web ページ要素を解析できます。 Web ページを照合する通常の方法や他の方法と比較して、phpQuery は非常に使いやすいです。
phpQuery を使用して Web ページを収集しているときに、問題が発生しました。大量の Web ページを処理した後、phpQuery が驚くべき量のメモリ (すぐに 1G を超えます) を占有しました。
たとえば、次のコード:
while (true) { phpQuery::newDocumentFile($htmlFile); // 处理网页元素... echo memory_get_usage() . "\n"; }
上記のコードを実行するとメモリがすぐに消費されてしまうので注意してください。
phpQuery のソース コードを確認したところ、phpQuery は Web ページを処理するたびに DOMDocumentWrapper オブジェクトを生成し、各 DOMDocumentWrapper オブジェクトは静的メンバーである $documents (phpQuery::createDocumentWrapper) 変数に保存されることがわかりました。 Web ページの配列要素が解析されるたびに増加する配列です。
phpQuery::$documents[$wrapper->id] = $wrapper;
問題が見つかったら、Web ページを解析するたびに phpQuery::$documents を空白のままにするだけで、簡単に解決できます。
while (true) { phpQuery::newDocumentFile($htmlFile); // 处理网页元素... phpQuery::$documents = array(); echo memory_get_usage() . "\n"; }