PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPスクリプトで大容量ファイルをダウンロードする方法

PHPスクリプトを使って大容量ファイルをダウンロードする場合、ファイル全体を一度にメモリへ読み込むとサーバーに大きな負担がかかり、memory_limitの制限に達してエラーになることもあります。そこで有効なのが、ファイルを小さなチャンク(塊)に分割して少しずつ読み込み、順次出力していく手法です。以下にその実装例を示します。

サンプルコード

<?php
function readfile_chunked($filename,$retbytes=true) {
    $chunksize = 1*(1024*1024); // 1回に読み込むバイト数(ここでは1MB)
    $buffer = '';
    $cnt = 0;
    $handle = fopen($filename, 'rb');
    if ($handle === false) {
        return false;
    }
    while (!feof($handle)) {
        $buffer = fread($handle, $chunksize);
        echo $buffer;
        if ($retbytes) {
            $cnt += strlen($buffer);
        }
    }
    $status = fclose($handle);
    if ($retbytes && $status) {
        return $cnt; // readfile()と同様に、配信したバイト数を返す
    }
    return $status;
}
?>

出力

このコードを実行すると、次のような結果が得られます。

大容量ファイルがダウンロードされる。

コードの解説

ユーザー定義関数「readfile_chunked」は、2つの引数を受け取ります。1つ目は対象となるファイル名、2つ目はバイト数を戻り値として返すかどうかを示すフラグで、デフォルト値は「true」です。この関数が正常に完了すれば、大容量ファイルのダウンロードが成功したことを意味します。

変数「chunksize」には、1回のループで読み込むバイト数が宣言されています(この例では1MB)。変数「buffer」は空文字列で初期化され、「cnt」は0に設定されます。その後、ファイルをバイナリ読み取りモード('rb')で開き、ファイルハンドルを変数「handle」に代入します。ファイルを開けなかった場合はfalseを返して処理を中断します。

whileループはファイルの終端(EOF)に達するまで繰り返され、指定されたチャンクサイズずつファイルの内容を読み込み、その都度出力へ書き出します。第2引数「retbytes」がtrueの場合は、読み込んだバッファの長さが変数「cnt」に加算されていきます。

ループ終了後、ファイルは閉じられ、その成否が変数「status」に格納されます。「retbytes」がtrueかつファイルのクローズに成功していれば、組み込み関数readfile()と同様に、配信した総バイト数「cnt」が返されます。それ以外の場合は「status」の値がそのまま返されます。

補足:ダウンロード用HTTPヘッダーの送信

ブラウザにファイルとして保存させるには、この関数を呼び出す前に適切なHTTPヘッダーを送信しておく必要があります。例えば以下のように記述します。

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="sample.zip"');
header('Content-Length: ' . filesize($filename));
readfile_chunked($filename);

このようにチャンク単位で読み出すことで、メモリ消費を一定量に抑えられ、数GB規模の大容量ファイルでも安定してダウンロードさせることができます。

  1. インターネットで大容量ファイルを送信する方法|無料で安全に送れる5つのサービス

    近年、インターネットを通じて大容量ファイルを送信するニーズは急速に高まっています。本記事では、手間をかけずに大容量ファイルを安全に転送できる、最も信頼性の高い方法をご紹介します。 GmailやOutlookといった標準的なメールサービスでは、25MBを超えるファイルを添付して送信することができません。そのため、大容量ファイルを送りたい場合は、別の手段を利用する必要があります。ここでは、セキュリティを確保しながら大容量ファイルを簡単に送れる方法を厳選して解説します。 大容量ファイルを無料で送信・転送する方法 まずはファイルを圧縮しよう: 大容量ファイルを送信する前に、圧縮ソフトを使ってファイルサ

  2. WordPressのwp-config.phpファイルを保護する方法を徹底解説

    ハッカーの視点で考えてみてください。何千ものWebサイトが利用しているプラットフォームに侵入したり、複数のサイトに対してブルートフォース攻撃を仕掛けたりするのは、彼らにとって魅力的な標的です。WP-Scannerのようなオープンソースツールが出回っている現在、初心者レベルの攻撃者でも、プロフェッショナルなWordPressサイトに侵入し、悪夢のような被害をもたらすことが可能になっています。 その中でもwp-config.phpは、サイトの運命を左右する最重要ファイルの一つです。このファイルが漏洩すれば、サイト全体が危険にさらされます。本記事では、wp-config.phpファイルを安全に保護す