如果用户具有正确的身份验证,我已经编写了一个简单的PHP脚本来下载隐藏文件。整个设置工作正常:它发送正确的标题,文件传输开始很好(并结束很好 - 对于小文件)。
但是,当我尝试提供150 MB的文件时,连接会在靠近文件中间的某处被神秘地中断。这是相关的代码片段(取自互联网上的某个地方并由我改编):
function readfile_chunked($filename, $retbytes = TRUE) {
$handle = fopen($filename, 'rb');
if ($handle === false) return false;
while (!feof($handle) and (connection_status()==0)) {
print(fread($handle, 1024*1024));
set_time_limit(0);
ob_flush();
flush();
}
return fclose($handle);
}
我在调用上面的函数之前也做了一些其他的代码,试图解决这个问题,但据我所知,它什么也没做:
session_write_close();
ob_end_clean();
ignore_user_abort();
set_time_limit(0);
正如您所看到的,它不会尝试立即将整个文件加载到内存中或者像这样疯狂。为了让它更加令人费解,转移它杀死它的实际点似乎漂浮在50到110 MB之间,它似乎在几秒内杀死所有连接到同一个文件(尝试通过尝试与朋友同时下载)。中断的文件没有附加任何内容,我在日志中看不到任何错误。
我正在使用Dreamhost,所以我怀疑他们的监视器可能会因为它运行时间太长而杀死我的进程。有没有人有经验可以分享这个问题?还有其他问题吗?有没有解决方法?
为了记录,我的Dreamhost设置为使用PHP 5.2.1 FastCGI。