ホームページ >バックエンド開発 >PHPチュートリアル >メモリ制限を超えずに PHP で大きなファイルをストリーミングするにはどうすればよいですか?

メモリ制限を超えずに PHP で大きなファイルをストリーミングするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-06 03:21:11600ブラウズ

How Can I Stream Large Files in PHP Without Exceeding Memory Limits?

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

PHP のメモリ制限を超える大きなファイルを扱う場合は、ファイルをユーザーのブラウザを完全にメモリにロードせずに実行します。この手法により、メモリ枯渇の問題を引き起こすことなく、大きなデータを効率的に処理できます。

ファイルをストリーミングする方法の 1 つは、file_get_contents() 関数を使用することです。ただし、この方法ではファイル全体をメモリにロードする必要があり、大きなファイルには現実的ではありません。

この制限を克服するには、ファイルを小さなチャンクに分割してストリーミングするチャンク アプローチを実装できます。順次。推奨されるアプローチは次のとおりです。

define('CHUNK_SIZE', 1024*1024); // Size (in bytes) of tiles chunk

// 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 num. bytes delivered like readfile() does.
    }

    return $status;
}

if (/* User is logged in */) {
    $filename = 'path/to/your/file';
    $mimetype = 'mime/type';
    header('Content-Type: '.$mimetype);
    readfile_chunked($filename);
} else {
    echo 'Access denied.';
}

このコードでは、readfile_chunked() 関数がファイルを 1MB のチャンクに分割し、各チャンクをユーザーのブラウザにストリーミングします。出力バッファをフラッシュすると、ファイル全体が読み取られるのを待たずにチャンクがすぐに送信されます。

このアプローチを実装すると、メモリの問題が発生することなく、大きなファイルを効率的にユーザーにストリーミングできます。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。