Webアドレスからサーバーを介してユーザーにファイルをストリーミングするスクリプトを作成しています。現在の状態では動作しますが、非常に低速です。
関連するコードは次のとおりです。
/* Bytes per second */
define('TRANSFER_CAP', 1048576);
/* Hard part... stream the file to the user */
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename=' . $filename);
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . $filesize);
$file = fopen($fileLocation, 'rb');
if(!$file) {
// TODO: handle errors
}
while(!feof($file)) {
echo fread($file, TRANSFER_CAP / 2);
ob_flush();
flush();
/* Limit the download speed by sleeping */
usleep(500);
}
このスクリプトは私のローカルマシンで実行されています。ブラウザでファイルを要求すると(スクリプトを使用せずに)、インターネットの最大速度である約2.5MB/秒の確実なダウンロード速度が得られます。ただし、スクリプトを実行して同じファイルをダウンロードしようとすると、約240〜250KB/秒しか取得できません。
1MB / sに設定しているので、転送速度を制限するスクリプトではないことはわかっています。また、このスクリプトでは、速度を低下させる大きなオーバーヘッドを生成するものは何も考えられません。
編集:何か面白いことですが、readfile()
代わりにこれを行うと、ほぼ完全なダウンロード速度が得られます:
readfile('http://cachefly.cachefly.net/100mb.test');
だからそれはとの使用に関する問題であるに違いありませんfopen
かfread
?