我通过 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()
功能有两个原因,一个是我想限制用户的下载速度(我可以fread
通过只读取这么多的数据来做到这一点),我还想跟踪用户正在下载多少(我可以做到这一点,readfile()
但它不计算部分下载)。
有谁知道为什么会发生这种情况或我该如何解决?据我所知readfile()
,这只是一个包装,fopen, fread and 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;
}