我通过 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($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;
}