【发布时间】:2010-06-01 01:16:06
【问题描述】:
在设置在线文件管理系统时,我遇到了障碍。
我正在尝试使用 modified version of readfile 将文件推送到客户端:
function readfile_chunked($filename,$retbytes=true) {
$chunksize = 1*(1024*1024); // how many bytes per chunk
$buffer = '';
$cnt =0;
// $handle = fopen($filename, 'rb');
$handle = fopen($filename, 'rb');
if ($handle === false) {
return false;
}
while (!feof($handle)) {
$buffer = fread($handle, $chunksize);
echo $buffer;
ob_flush();
flush();
if ($retbytes) {
$cnt += strlen($buffer);
}
}
$status = fclose($handle);
if ($retbytes && $status) {
return $cnt; // return num. bytes delivered like readfile() does.
}
return $status;
}
但是当我尝试下载一个 13 MB 的文件时,它只是突破了 4 MB。 这里会有什么问题?这绝对不是任何形式的时间限制,因为我在本地网络上工作,速度不是问题。
PHP 中的内存限制设置为 300 MB。
感谢您的帮助。
【问题讨论】:
-
几乎可以肯定错误日志中有一些内容,假设您已将其打开。检查并修改问题。
-
不。错误日志中没有与此相关的内容。我所拥有的只是来自不同脚本的一些弃用警告。
-
您使用什么客户端下载内容?如果您使用不同的客户端,行为会改变吗?我的猜测是您使用的代理无法处理大块编码。尝试不同的客户端/和/或嗅探流量。
-
@symcbean - 我尝试同时使用 IE 和 Chrome,两者的响应方式相同。如果他们不能处理分块编码,我相信他们不应该占用前 4 MB。还有,如何嗅探流量?以前没有这样做过。谢谢!
-
一个优秀的数据包嗅探器是Wireshark。检查错误发生后数据是否仍在流式传输,并检查是否有任何错误消息由于某种原因被发回,而您没有看到。