「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > メモリを枯渇させずに PHP で大きなファイルを効率的に処理するにはどうすればよいですか?

メモリを枯渇させずに PHP で大きなファイルを効率的に処理するにはどうすればよいですか?

2024 年 10 月 31 日公開
ブラウズ:266

How to Handle Large Files in PHP Efficiently without Causing Memory Exhaustion?

メモリを枯渇させずに PHP を使用して大きなファイルを処理する

メモリ制限により、PHP で大きなファイルの読み取りと処理が困難になる場合があります。 file_get_contents() 関数は、許可されている以上のメモリを消費する大きなファイルを処理するときに、「メモリが枯渇しました」エラーを引き起こす可能性があります。

メモリ割り当てについて

file_get_contents( を使用する場合) )、ファイル全体が読み取られ、文字列としてメモリに保存されます。大きなファイルの場合、割り当てられたメモリを超えてエラーが発生する可能性があります。

代替アプローチ: チャンク ファイルの読み取り

この問題を回避するには、次のような代替方法の使用を検討してください。 fopen() および fread() としてファイルをチャンクで読み取ります。これにより、一度にファイルのより小さなセクションを処理し、メモリ使用量を効果的に管理できるようになります。このアプローチを実装する関数は次のとおりです。

function file_get_contents_chunked($file, $chunk_size, $callback)
{
    try {
        $handle = fopen($file, "r");
        $i = 0;
        while (!feof($handle)) {
            call_user_func_array($callback, [fread($handle, $chunk_size), &$handle, $i]);
            $i  ;
        }
        fclose($handle);
        return true;
    } catch (Exception $e) {
        trigger_error("file_get_contents_chunked::" . $e->getMessage(), E_USER_NOTICE);
        return false;
    }
}

使用例

この関数を使用するには、チャンクを処理するコールバックを定義し、必要なパラメータを指定します:

$success = file_get_contents_chunked("my/large/file", 4096, function ($chunk, &$handle, $iteration) {
    /* Do something with the chunk */
});

追加の考慮事項

もう 1 つの最適化は、大きな入力に適用すると大量のメモリを消費する可能性がある複雑な正規表現の使用を避けることです。代わりに、strpos、substr、explode などのネイティブ文字列関数を使用することを検討してください。

リリースステートメント この記事は次の場所に転載されています: 1729143617 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3