誰かが私が直面しているこの問題で私を助けてくれることを願っています. cURL ライブラリと DOMDocument ライブラリを使用して Web サイトからページを取得し、サイト リンクをたどってさらに多くのページからデータを検索して取得するスパイダーを作成しました。私が具体的に引き出すデータはキーワード (HTML/スクリプト コードではないページ上のすべての単語) であり、後で mySQL データベースに保存されます (URL、親 URL、ランタイムなどのクロール/ページ情報と共に) 、キーワード数など)。
私の問題は、メモリ、より具体的にはメモリ不足に関するものです。スパイダーがサイトのトップから 1 レベルしか下がらない場合、それは 500 個のリンクになる可能性があり、これまでのテストでは平均で約 100 万個のキーワードが検出されました。メモリはすぐに使い果たされ、同じスクリプトで他の Web サイトのスパイダーを実行しようとすると、メモリ不足エラーが発生することがよくあります。後者の問題に対処するために、pcntl を実装していくつかの追加のスパイダーを並行して実行することを計画していますが、個々のスパイダーが抽出する膨大な量のデータからメモリ不足になる可能性にはまだ対処していません。
私の質問は、さまざまな量のデータを処理するアプリケーションで、この種のメモリ不足の問題を処理するための一般的な方法はありますか? 最初は、APC キャッシングを実装してキーワード データを保存しようとしていましたが、APC は厳密にオペコード キャッシングに使用されていることがわかりました。これは、頻繁にアクセスする PHP の Web サーバー アクセスを高速化するために、オペコードのみを RAM に保存することを意味しているようです。コード(私の目的では冗長であり、いずれにせよ、私のスパイダーアプリケーションはとにかくcronジョブとして実行されるはずです)。スパイダーが移動するときにキーワードデータをファイルにキャッシュする必要がありますか、それとも正しい方向に進むのに役立つと考えるべきライブラリ/フレームワークがありますか? うまくいくだろうと思ってアプローチを試みて、同じ過ちを2回犯したくないだけです。そして、最終的に私が自分の車輪を回転させていたことに気づきました。誰でも提供できるヘルプをありがとう!