我正在通過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;
}
你真的需要輸出緩衝嗎?試試'ob_end_flush();' – Boann
我不確定,我從別的地方得到了這段代碼,它有輸出緩衝。我應該在哪裏放置'ob_end_flush();'? –
把它放在任何地方,然後再開始寫作。 – Boann