我正在通过PHP脚本从URL向我的用户提供下载.使用readfile()时,我的连接可以获得支持的最大下载速度(大约2.5MB / s),但是当我使用fopen,fread,fclose路由时,下载速度非常非常慢(大约1-2KB / s).
这是我的代码:
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . $filesize);
ob_clean();
flush();
$file = fopen($url, 'rb');
while(!feof($file)) {
echo fread($file, 2014);
}
而readfile代码就是readfile($link);.
由于两个原因,我不能只使用readfile()函数,一个是我想限制用户的下载速度(我可以通过仅读取这么多数据来进行读取),并且我还想跟踪用户的数量正在下载(我可以使用readfile()进行此操作,但不算部分下载).
有谁知道为什么会发生这种情况或如何解决?据我所知,readfile()只是fopen,fread和fclose的包装器,因此我不会出什么问题.
编辑:最终为此使用了cURL.
$curl = curl_init();
$options = array(
CURLOPT_URL => $rdLink,
CURLOPT_FAILONERROR => true,
CURLOPT_BINARYTRANSFER => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_WRITEFUNCTION => 'readResponse'
);
curl_setopt_array($curl, $options);
if(!curl_exec($curl)) {
header('Location: http://whatever.com');
exit;
}
curl_close($curl);
function readResponse($ch, $data) {
$length = mb_strlen($data, '8bit');
echo $data;
return $length;
}
解决方法:
使用stream_context_create()和stream_get_contents()
$context = stream_context_create();
$file = fopen($url, 'rb', FALSE, $context);
while(!feof($file))
{
//usleep(1000000);
echo stream_get_contents($file, 2014);
}
您也可以尝试使文件读取长度变长,然后放入usleep()以减慢执行速度.
无论如何,似乎建议不要将流功能推荐为最新版本的PHP.
您可能还希望在fread()或stream_get_contents()前面加一个@,以抑制任何错误,至少在生产中.没有它,还有一点不幸,您的文件已损坏.