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 サイトの他の関連記事を参照してください。