PHP文件下载问题

nse*_*rle 2 php file download file-get-contents

我目前遇到一些用户下载存储在我服务器上的文件的问题.我将代码设置为在用户点击下载按钮后自动下载文件.它适用于所有文件,但是当大小超过30 MB时,它就会出现问题.用户下载是否有限制?另外,我提供了我的示例代码,我想知道是否有比使用PHP函数'file_get_contents'更好的做法.

谢谢大家的帮助!

$path = $_SERVER['DOCUMENT_ROOT'] . '../path/to/file/';
$filename = 'filename.zip';
$filesize = filesize($path . $filename);
@header("Content-type: application/zip");
@header("Content-Disposition: attachment; filename=$filename");
@header("Content-Length: $filesize")
echo file_get_contents($path . $filename);
Run Code Online (Sandbox Code Playgroud)

Pas*_*TIN 6

file_get_contents() 将整个文件加载到内存中 - 使用它的日志.

而且,在PHP中,脚本可以使用的内存量是有限的(请参阅参考资料memory_limit) - 这可能解释了您的下载脚本不适用于大文件.


readfile()相反, 使用可能是更好的选择:它将读取文件,并直接将其内容发送到输出缓冲区.

这意味着 :

  • 不将整个文件加载到内存中
  • 无需回显您在内存中加载的内容.

只是使用这样的东西应该没问题:

$path = $_SERVER['DOCUMENT_ROOT'] . '../path/to/file/';
$filename = 'filename.zip';
$filesize = filesize($path . $filename);
@header("Content-type: application/zip");
@header("Content-Disposition: attachment; filename=$filename");
@header("Content-Length: $filesize")
readfile($path . $filename);
Run Code Online (Sandbox Code Playgroud)


(顺便说一句:你真的想保持沉默的错误这种方式,与@运营商的另一种解决方案是不显示它们,但它们记录到文件-看?display_errors,log_errorserror_log)