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

PHP で大きなファイルを完全にメモリにロードせずにストリーミングするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-19 22:38:15
オリジナル
454 人が閲覧しました

How Can I Stream Large Files in PHP Without Loading Them Entirely into Memory?

PHP での大きなファイルのストリーミング

PHP の組み込み file_get_contents 関数は、ファイルを文字列に読み取る便利な方法ですが、重要な制限: ファイル全体を一度にメモリにロードします。これは、PHP のメモリ制限を使い果たし、スクリプトが失敗する可能性があるため、大きなファイルの場合には問題となる可能性があります。

幸いなことに、大きなファイルをすべてメモリにロードせずにユーザーにストリーミングする方法があります。 1 つの手法には、readfile_chunked 関数の使用が含まれます。この関数はファイル名を引数として受け取り、ファイルの内容を指定されたサイズのチャンクで出力バッファに送信します。

readfile_chunked 関数の使用方法の例を次に示します。

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

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

    return $status;
}

// Check if the user is logged in
// ...

if ($logged_in) {
    $filename = 'path/to/your/file';
    $mimetype = 'mime/type';
    header('Content-Type: ' . $mimetype);
    readfile_chunked($filename);

} else {
    echo 'Tabatha says you haven\'t paid.';
}
ログイン後にコピー

この例では、CHUNK_SIZE 定数を定義して、各チャンクのサイズ (バイト単位) を指定します。次に、readfile_chunked 関数がファイルをチャンク単位で読み取り、出力バッファーに送信します。 ob_flush 関数とフラッシュ関数は、チャンクが生成されるときに確実にクライアントに送信されるようにするために呼び出されます。

この手法を使用すると、ファイル全体をメモリにロードすることなく、大きなファイルをユーザーにストリーミングできます。これは、HTTP 接続経由で大きなファイルを配信する効率的な方法です。

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

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