使用 PHP 流式传输大文件
在您希望安全地为用户提供大文件一次性下载而不消耗过多资源的场景中内存,问题出现了:如何高效地传输文件?
使用 file_get_contents() 的传统方法由于潜在的内存限制,同时检索整个文件内容被证明是不切实际的。要解决此问题,请考虑采用以可管理的块的形式提供数据的流式传输方法。
在线源中建议的一种解决方案是使用 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中文网其他相关文章!