ホームページ > バックエンド開発 > PHPチュートリアル > 大きなファイルで file_get_contents() を使用するときにメモリ枯渇エラーを回避するにはどうすればよいですか?

大きなファイルで file_get_contents() を使用するときにメモリ枯渇エラーを回避するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-17 13:43:29
オリジナル
593 人が閲覧しました

How to Avoid Memory Exhaustion Errors when Using file_get_contents() with Large Files?

File_get_contents のメモリ枯渇: 包括的な解決策

大きなファイルの処理を扱う場合、悪名高い PHP 致命的エラー: 許可されたメモリの枯渇エラーが繰り返し発生する可能性があります。この問題は、file_get_contents() がかなりのサイズのファイルの内容全体をメモリに読み取ろうとし、割り当てられたメモリ制限を超える場合に発生します。

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 サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート