私のPHPアプリには、レコードをインポートできるインポートスクリプトがあります。
現在、CSVファイルからインポートしています。CSVファイルの各行をfgetcsvを使用して一度に1行ずつ読み取り、各行について、データベースクエリを含むそのレコードに対して多くの処理を実行してから、次の行に移動します。より多くのメモリを蓄積し続ける必要はありません。
約2500レコードがインポートされた後、PHPはメモリ制限(132 MB程度)を超えたと言って停止します。
CSVファイル自体はほんの数メガです-発生する他の処理は多くの文字列比較、差分などを行います。私はそれを操作する大量のコードを持っており、最小の複製を思い付くのは難しいでしょうサンプル'。
そのような問題を見つけて修正するための良い方法は何ですか?
問題の原因が見つかりました
実行時にすべてのデータベースクエリをログに記録するデバッグクラスがあります。そのため、約30KBの長さのSQLの文字列がメモリに残っていました。これは、長時間実行するように設計されたスクリプトには適していないことに気付きました。
他にもメモリリークの原因がある可能性がありますが、これが私の問題の原因であると確信しています。