この投稿は、2012-10-31 16:13:59 に zmzkkk によって最終編集されました
皆さんこんにちは。PHP プロジェクトに取り組むときにメモリ管理に注意を払っていますか? Web サイトを収集するコードを作成し、CURL がそれを収集し、MYSQL が一度に 1 レコードずつ大量のデータを書き込みました。コレクションは、最初に実行を開始したときは非常に高速でした。ただし、しばらくすると、収集速度が何倍も遅くなります。最初の収集中、プログラムは約 3 時間実行され、メモリ オーバーフロー エラーが発生しました。ここで 2 番目の収集が開始されます。memory_get_usage を使用して、収集プロセスのメモリ使用量を記録します。メモリ使用量が徐々に増加しています。一度もリリースされていません。もう 1 つ問題があり、Google ブラウザを使用してデータを収集した場合、Web ページを閉じても収集プログラムが実行されたままであることがわかりました。この分野で経験のある人はいますか?アドバイスをいただけますか? gc_collect_cycles() を使用してガベージコレクション処理を開始できるかどうかはわかりません。
-----解決策--------------------------------ループコレクションがかかっていますか?
-----解決策---------データを追加するたびに、未使用の変数をすべて UNSET してください。これらのジャンク データがメモリを占有します。
------解決策------ ---curl はループ中に解放されますか?
------解決策---------curl_close()
------解決策----------------------各サイクルの最後に、不要なものをすべて設定解除します。
次に、ループの開始時のメモリ使用量と基本的に同じになるまで比較します
これは時間がかかるデバッグ ジョブです
gc_collect_cycles は、明示的に呼び出さなくてもガベージ コレクションが発生するため、基本的には役に立ちません
------解決策------ --------------スリープは依然としてプログラムの実行を遅くし、メモリ使用量とは関係ありません
-----解決策---------この問題を解決するにはシェルを使用することをお勧めします:
おそらく解決策は exec(xx.php,$args);
です。
このようにして、各 exec が実行された後、xx.php ファイルによって占有されていたリソースが直接解放されます
-----解決策----------- --- -----
この方法で実行できます。$list ループ内のすべてのコードを別の PHP ファイルに書き込み、シェルの背景を直接使用します。
- - ----解決策--------------------
まず、ループ本体内の tp のいくつかの操作 (読み取りと書き込みを含む) をコメントアウトします。 tp に問題がないことを確認します
------解決策------------------
その後バッチ処理を使用します