PHPスクリプトを介してURLからユーザーにダウンロードを提供しています。使用するreadfile()
と、接続でサポートできる最大ダウンロード速度(約2.5MB /秒)が得られますが、fopen, fread, fclose
ルートを使用すると、ダウンロード速度が非常に遅くなります(約1〜2KB /秒)。
これが私のコードです:
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()
理由は2つあります。1つは、ユーザーのダウンロード速度を制限したい(これはfread
、大量のデータを読み取るだけで実行できます)。また、ユーザーがダウンロードしている量を追跡したい(Iでこれを行うことができます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;
}