今日は、PHP コードを使用して、合計 219 万行を超えるレコードを持つ 5 億 8,000 万のログ ファイルを処理する必要があります。これは .log ファイルであるため、Windows ではエントリ数に応じてファイルを分割するのが困難です。 Linux では、split -l を使用します。ファイル名プレフィックス 10000 は、ファイル全体を 10000 行に基づいて 200 を超える小さなファイルに分割し、PHP を使用してこれらの 200 を超えるファイルをループで処理します。上記のエラーが表示されました:
Baidu に行ったところ、php.ini のメモリ割り当ての問題であることがわかりました。コードの実行時にさらに多くのメモリが必要な場合、デフォルトでは、PHP コードが適用できる最大メモリ バイト数は 134217728 バイトです。 、エラーが報告されるため、php.ini ファイルの設定を変更しました。
しかし、よく考えてみると、PHP スクリプトが一度に要求するメモリ空間は 128M を超えるため、将来的にどれだけ大きくmemory_limitを設定したとしても、将来的には間違いなく問題が発生するでしょう。
その理由は、コーディング中に変数に値を代入するだけで、設定を解除($var)しなかったためです。これによりメモリ使用量がますます増加するため、変数が使用されなくなった後は、忘れずに設定を解除する必要があります。
set_time_limit(1800) ;
/**
* 送信に失敗したメールアドレスをログから取得します
* @param $directory ログディレクトリ
* @param $name 失敗したメールボックスに保存されたファイル名
*/
関数 getmail($directory,$name){
// ディレクトリ内の .log ファイルを走査します
$files=scandir("$ディレクトリ");
foreach($files as $v){
If(preg_match_all("|mail.logD+|",$v,$log)){
$logs[]=$log[0][0];
}
}
//すべての .log ファイルから送信に失敗したメールを抽出します
foreach($logs as $v){
$row=file("$v");
Echo "read"を添えて。$ v。 "file< br />";
foreach($row as $key => $value)
{
If(eregi("ホスト名の検索に失敗しました|接続がタイムアウトしました|接続が拒否されました|逆ホスト名が見つかりません", $value)){
if(preg_match("|w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*|", $row[$key],$matches)) {
$mail[] = トリム($matches[0]);
echo "送信に失敗したメール アドレスを取得します".$matches[0]."
";
}その他{
echo "ログに送信に失敗したメールアドレスを取得できませんでした。確認してください";
}
}
}
unset($row);
}
// 抽出して送信に失敗したメールアドレスを mail.txt ファイルに書き込みます
$mailurl=fopen("$name","a");
foreach($mail as $line)
{
fwrite($mailurl,$line."rn");
}
echo "送信に失敗したすべてのメール アドレスを ".$name" に書き込みます。
";
fclose($mailurl);
}
getmail(".","mail.txt");
?>
http://www.bkjia.com/PHPjc/908177.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/908177.html技術記事致命的なエラー: 許容メモリ サイズ 134217728 バイトが使い果たされました (2611816 バイトを割り当てようとしました)、割り当て 2611816 今日は、PHP コードを使用して、合計 580M のログ ファイルを処理する必要があります...