Php 提供的大型zip文件在客户端上显示为0字节文件

Php 提供的大型zip文件在客户端上显示为0字节文件,php,apache,Php,Apache,我通过apache通过php提供文件。我遇到了一个问题,相对较大的文件(我使用的是350 MB的zip)似乎一直在下载,但在客户端,它们看起来是一个零字节的文件 一次只提供一个文件,提供的唯一文件是zip文件。我对较小的文件没有问题。(例如70MB)。我将时间和内存限制提高到了似乎过于慷慨的值(在php和php.ini中)。大约20-30秒后,下载完成,但在Firefox和Chrome中都没有好结果: Firefox:没有错误消息。对话框弹出保存或打开。它保存为零字节文件。如果被告知打开,win

我通过apache通过php提供文件。我遇到了一个问题,相对较大的文件(我使用的是350 MB的zip)似乎一直在下载,但在客户端,它们看起来是一个零字节的文件

一次只提供一个文件,提供的唯一文件是zip文件。我对较小的文件没有问题。(例如70MB)。我将时间和内存限制提高到了似乎过于慷慨的值(在php和php.ini中)。大约20-30秒后,下载完成,但在Firefox和Chrome中都没有好结果:

Firefox:没有错误消息。对话框弹出保存或打开。它保存为零字节文件。如果被告知打开,winzip将提供一条错误消息,说明文件已损坏。 Chrome:大约20秒后,它会显示“此网页不可用”并显示。它还说“错误代码:错误内容长度不匹配”

我不知道这是否意味着什么,但我在Chrome的开发工具中查看了网络活动,70MB文件在正确送达后显示为(已取消)状态

以下是php代码:

ini_set('memory_limit', '500M');  //also see memory_limit in php.ini
set_time_limit(60);  //also max_execution_time in php.ini
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream'); //also tried application/zip
header('Content-Disposition: inline; filename='.basename($fileLocation));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($fileLocation));
ob_clean();
flush();
readfile($fileLocation);
exit;

谢谢大家!

在60秒内下载350 MB(您的时间限制是多少)将变成每秒5,8 MB。听起来很有挑战性。只需更改您的时间限制:

set_time_limit(60*30);  //also max_execution_time in php.ini

我想在后来的一次测试中我把它提高到了600秒,但即使是60秒,它也会在20-30秒左右完成。通常在计时和/或大小设置上会发生类似的事情。您需要检查php、apache和本地浏览器上的所有计时和缓存大小设置。还要检查可用内存和代理约束(如果使用)。结构化调试过程还包括检查/配置php和apache的(错误)日志。查看说明:“readfile()本身不会出现任何内存问题,即使在发送大文件时也是如此。”