我目前遇到的问题是我的下载总是停在几乎一千兆字节。我创建了一个PHP下载脚本,它在下载之前检查用户权限,然后阻止复制URL。为此,我使用fread()通过PHP传递数据。但是,我不知道为什么下载总是在一千兆字节后完全停止。该文件大约是文件的两倍。
有人可以看看这个吗?
// ... Permission check, get download url, etc. ...
try
{
define('CHUNK_SIZE', 8 * 1024);
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;
if(ob_get_level() > 0)
{
ob_flush();
flush();
}
if ($retbytes)
{
$cnt += strlen($buffer);
}
}
$status = fclose($handle);
if ($retbytes && $status)
{
return $cnt;
}
return $status;
}
$mimetype = 'mime/type';
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $download->url);
readfile_chunked($download->url);
}
catch(Exception $e)
{
echo "Error while reading the file";
exit;
}
更新:
我现在已经在另一台服务器上测试了该脚本。这里的下载有时在300 MB之后终止,有时在1.3 GB之后终止。然后我定义了以下设置:
ini_set('display_errors', 0);
ini_set('error_reporting', E_ALL);
ini_set("log_errors", 1);
ini_set("error_log", "error.log");
ini_set('memory_limit', '-1');
ini_set('max_execution_time', 7200);
在另一台服务器上,脚本现在已经运行了几次而没有任何问题。下载完成,文件没有错误。但是,我将这些设置复制到原始系统,下载仍然停止。我连续三次下载了这个文件。文件大小略有不同:
我的想法已经不多了。还有什么呢?它们都是Apache Web服务器。
日志中也没有明显的条目。