前の記事では、データ テーブルをクエリするときに、PHP で「許容メモリ サイズは xxx バイトです」というエラーが発生しましたが、php.ini の設定を変更せずに、別の関数を使用してこの問題を解決しました。この記事では、ファイルの読み取り時にこの問題を解決する方法について説明します。
ファイルを読み取るとき、file_get_contents() と file() は操作が少なくて済むため、ここでは操作オブジェクトとして 200M のログ ファイルをダウンロードしました。
// 这里是一般的写法//$file = file_get_contents($log_file);$file = file($log_file);$start = memory_get_usage();$end = memory_get_usage();$used = $end - $start;echo $used;
file_get_contents または file に関係なく、予想どおり、「致命的なエラー: 許容メモリ サイズ 134217728 バイトを使い果たしました」というエラーが発生しました。
ここで、
コード 1:
これは fgets() を使用して一度に 1 行ずつ読み取る結果ですが、他のいくつかの記述方法を見ていきます。行が比較的大きい場合 次に、メモリ不足を示すエラー メッセージが表示されます。
function test1($log_file) {// 内存:664byte// 时间:13.063009977341秒 $fp = fopen($log_file, 'r+'); while(! feof($fp)) { //$row = fgets($fp); $row = fread($fp, 2048); echo $row, "\r\n"; } fclose($fp);}
コード 2:
ここでは、fread() 関数を使用して、読み取られるデータのサイズを制御します。このメモリ使用量は、各読み取りの設定データ サイズに直接関係します。
function test3($log_file) {// 内存:656byte// 时间:9.2053289413452秒 $fp = fopen($log_file, 'r+'); while(! feof($fp)) { $row = fread($fp, 2048); //echo $row; } fclose($fp);}
コード 3:
このメソッドは、次を使用してファイルを開きます。パイプ。 fgets() を使用する同じ条件下でコード 1 と比較すると、占有メモリはコード 1 よりも少なくなります。
function test2($log_file) {// 内存:352byte// 时间:13.38470697403秒 $cmd = "cat {$log_file} 2>&1"; $fp = popen($cmd, "r"); while(!feof($fp)) { $row = fgets($fp); echo $row, "\r\n"; } pclose($fp);}
この他にも fseek() 関数などを使用する方法もありますが、いずれも目的は同じです。処理されたデータはメモリに読み取られ、メモリ使用量が削減されます。
php を使用してシステム コマンドを呼び出して、目的を達成することもできます。そのソリューションはここではテストされていません。
テストに使用した関数を以下に示します。
$start = memory_get_usage();$time1 = microtime(true);test3($log_file);$end = memory_get_usage();$time2 = microtime(true);$used = $end - $start;$limit = $time2 - $time1;echo "内存:", $used, "byte\r\n时间:", $limit, "秒\r\n";