ホームページ > バックエンド開発 > PHPチュートリアル > メモリの枯渇を避けるために、PHP で大きなファイルを効率的にストリーミングするにはどうすればよいですか?

メモリの枯渇を避けるために、PHP で大きなファイルを効率的にストリーミングするにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-05 14:38:15
オリジナル
481 人が閲覧しました

How Can I Efficiently Stream Large Files in PHP to Avoid Memory Exhaustion?

PHP を使用した大きなファイルのストリーミング

大量のファイルを大量に消費することなく 1 回限りのダウンロードをユーザーに安全に提供したいシナリオメモリが不足している場合、次のような疑問が生じます: ファイルを効率的にストリーミングするにはどうすればよいでしょうか?

を使用する従来のアプローチfile_get_contents() を使用してファイルの内容全体を同時に取得するのは、潜在的なメモリ制限のため非現実的であることがわかります。この問題に対処するには、データを管理可能なチャンクで配信するストリーミング方式の採用を検討してください。

オンライン ソースで提案されている解決策の 1 つは、readfile_chunked() 関数を使用することです。この関数を使用すると、チャンク サイズを指定し、ファイルの内容を繰り返し読み取って出力し、メモリの過負荷を回避できます。

提供されているコード サンプルは、このアプローチの実装を示しています。

// Define the chunk size in bytes
define('CHUNK_SIZE', 1024*1024);

// Function to read a file and display its content chunk by chunk
function readfile_chunked($filename, $retbytes = TRUE) {
    $buffer = '';
    $cnt = 0;
    $handle = fopen($filename, 'rb');

    if ($handle === false) {
        return false;
    }

    while (!feof($handle)) {
        $buffer = fread($handle, CHUNK_SIZE);
        echo $buffer;
        ob_flush();
        flush();

        if ($retbytes) {
            $cnt += strlen($buffer);
        }
    }

    $status = fclose($handle);

    if ($retbytes & $status) {
        return $cnt; // Return the number of bytes delivered.
    }

    return $status;
}

// Restrict access to logged-in users
if ($logged_in) {
    $filename = 'path/to/your/file';
    $mimetype = 'mime/type';
    header('Content-Type: '.$mimetype );
    readfile_chunked($filename);
} else {
    echo 'Access denied.';
}
ログイン後にコピー

このアプローチファイルを管理可能なチャンクに分けてストリーミングし、メモリの制約を回避し、ファイルをユーザーに効率的に配信します。

以上がメモリの枯渇を避けるために、PHP で大きなファイルを効率的にストリーミングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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