大きなファイルの処理を扱う場合、悪名高い PHP 致命的エラー: 許可されたメモリの枯渇エラーが繰り返し発生する可能性があります。この問題は、file_get_contents() がかなりのサイズのファイルの内容全体をメモリに読み取ろうとし、割り当てられたメモリ制限を超える場合に発生します。
ファイル全体を読み込む代わりにメモリに書き込む場合、より効率的な方法は、ファイルをポインタとして開き、fread() を使用して小さなチャンクで読み取ることです。これにより、大きなファイルの処理に重要なメモリ管理が可能になります。
以下は、Node.js のファイル処理 API の機能を模倣するカスタム関数です。
<code class="php">function file_get_contents_chunked($file, $chunk_size, $callback) { try { $handle = fopen($file, "r"); $i = 0; while (!feof($handle)) { call_user_func_array($callback, array(fread($handle, $chunk_size), &$handle, $i)); $i++; } } catch (Exception $e) { trigger_error("file_get_contents_chunked::" . $e->getMessage(), E_USER_NOTICE); return false; } fclose($handle); return true; }</code>
この関数は 3 つを受け入れます。パラメータ: ファイル パス、必要なチャンク サイズ、および各チャンクの読み取りごとに呼び出されるコールバック関数。
file_get_contents_chunked() 関数は次のように使用できます。 :
<code class="php">$success = file_get_contents_chunked("my/large/file", 4096, function ($chunk, &$handle, $iteration) { /* Process the chunk here... */ });</code>
大量のデータに対して複数の正規表現操作を実行するのは非効率です。 strpos()、substr()、trim()、explode() などのネイティブの文字列操作関数を使用することを検討してください。
の代わりに:
<code class="php">$newData = str_replace("^M", "", $myData);</code>
使用方法:
<code class="php">$pattern = '/\r\n/'; $replacement = ''; $newData = preg_replace($pattern, $replacement, $myData);</code>
前述の手法を利用すると、メモリ枯渇エラーが発生することなく、大きなファイルを効率的に処理できます。
以上が大きなファイルで file_get_contents() を使用するときにメモリ枯渇エラーを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。