7

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');

だからそれはとの使用に関する問題であるに違いありませんfopenfread

4

2 に答える 2

0

基本的に、PHP を使用してプロキシ サーバーを構築しています。mod_proxy ( http://httpd.apache.org/docs/2.2/mod/mod_proxy.html ) または Squid Proxy ( http://www.squid-cache.org/ )の使用を検討しましたか?

于 2013-02-02T23:05:06.650 に答える
0

バイナリ ファイル自体への HTTP ヘッダー リダイレクトを実行しないのはなぜですか? そうすれば、必要なのはファイルを提供することだけなので、PHP をすべて一緒に方程式から外します。

于 2013-02-02T15:57:58.570 に答える