私はすべてのアドワーズ広告アカウントのすべての広告とキーワードの情報を取得するためにadwordsレポートapiを使用しています。現在のアカウント数は1363です。レポートAPIはCSVを生成していますが、これを解析するのは以下の関数です。良い1180アカウントを解析すると、エラーが返されます。PHPでメモリ不足の原因を解析する
Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 262144 bytes) .
私は512MBにメモリを設定しました。
エラーは、上記の機能が
$data = $this->convertCSVtoArray($filePath);
は、私は信じているメソッドから呼び出され
try {
$file_handle = fopen($csvFile, 'r');
while (!feof($file_handle)) {
$line_of_text[] = fgetcsv($file_handle, 1024);
}
fclose($file_handle);
return $line_of_text;
} catch (Exception $e) {
log_message('Exception in convertCSVtoArray()', $e);
throw new Exception('Exception in convertCSVtoArray => '.$e);
}
}
このライン
$line_of_text[] = fgetcsv($file_handle, 1024);
プライベート関数convertCSVtoArray($ csvfile内){に来ます与えられたコードのどこかにメモリリークがあり、それはすべてのメモリを食べています。
解決策があるかどうかをご提案ください。一つの特定のスクリプトのメモリ制限を変更する
:
また、このようなサーバのphp.iniファイルには、このように行を追加することで、サーバ上で実行されているすべてのPHPスクリプトのための恒久的な変化を作ることができます。これはあなたが読んでいる唯一のファイルですか?レコード数(1360)と指定された 'fgetcsv'の長さ(1024)に基づいて、私のテストでは約2-4MBしか消費しません。 'convertCSVtoArray'を実行する前に' memory_get_usage'を使って呼び出し前にメモリ使用量がまだ高くなっていないことを確認しましたか? (ループに入る前に実際に読み込みハンドルを取得したことを確認するチェックを追加する必要があります。もし 'fopen'がfalseを返すと、メモリ制限に達するまで無限ループが続きます'feof'が決して真実を返すことはないので) – EPB