2

PHPスクリプトからの発信応答の速度を制限するには? したがって、キープアライブ接続でデータを生成するスクリプトがあります。ファイルを開いて読み取るだけです。発信速度を制限する方法

(今では私はそのようなコードを持っています)

if(isset($_GET[FILE]))
 {
  $fileName = $_GET[FILE];
  $file =  $fileName;

  if (!file_exists($file))
  {
   print('<b>ERROR:</b> php could not find (' . $fileName . ') please check your settings.'); 
   exit();
  }
  if(file_exists($file))
  {
   # stay clean
   @ob_end_clean();
   @set_time_limit(0);

   # keep binary data safe
   set_magic_quotes_runtime(0);

   $fh = fopen($file, 'rb') or die ('<b>ERROR:</b> php could not open (' . $fileName . ')');
   # content headers
   header("Content-Type: video/x-flv"); 

   # output file
   while(!feof($fh)) 
   {
     # output file without bandwidth limiting
     print(fread($fh, filesize($file))); 
   } 
  } 
 }

では、応答速度を制限するにはどうすればよいでしょうか (たとえば 50 kb/s に制限します)。

4

5 に答える 5

4

ファイル全体を一度に出力するのではなく、ファイル出力を段階的に変更します。

# output file
while(!feof($fh)) 
{
    # output file without bandwidth limiting
    print(fread($fh, 51200)); # 51200 bytes = 50 kB
    sleep(1);
}

これは 50kB を出力し、ファイル全体が出力されるまで 1 秒待ちます。帯域幅を約 50kB/秒に制限する必要があります。

これは PHP 内で可能ですが、Web サーバーを使用してスロットリングを制御します

于 2010-06-24T14:17:30.523 に答える
2

帯域幅を制限するためにphpを使用しません:

Apacheの場合:Bandwidth Mod v0.7ハウツー-Apache2の帯域幅リミッター

Nginxの場合:http ://wiki.nginx.org/NginxHttpCoreModule#limit_rate

Lighttpdの場合:http ://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:TrafficShapingこれにより、PHPで接続ごとの速度を構成することもできます。

于 2010-06-24T14:25:07.667 に答える
0

「Ben S」と「igorw」の方法は間違っていると思います。なぜなら、それらは間違った仮定である無制限の帯域幅を暗示しているからです。基本的に言うスクリプト

while(!feof($fh)) {
   print(fread($fh, $chunk_size));
   sleep(1);
}

かかった時間に関係なく、$chunk_size バイト数を出力した後、1 秒間一時停止します。たとえば、現在のスループットが 100kb で、250kb でストリーミングしたい場合、上記のスクリプトは print() を実行するのに 2.5 秒かかり、さらに 1 秒待機して、実際の帯域幅を効果的に約 70kb に押し下げます。

解決策は、PHP が print() ステートメントを完了するのにかかった時間を測定するか、バッファを使用して fread() ごとにフラッシュを呼び出す必要があります。最初のアプローチは次のとおりです。

list($usec, $sec) = explode(' ', microtime());
$time_start = ((float)$usec + (float)$sec);
# output packet
print(fread($fh, $packet_size));
# get end time
list($usec, $sec) = explode(' ', microtime());
$time_stop = ((float)$usec + (float)$sec);
# wait if output is slower than $packet_interval
$time_difference = $time_stop - $time_start;
if($time_difference < (float)$packet_interval) {
    usleep((float)$packet_interval*1000000-(float)$time_difference*1000000);
}

2番目は次のようになります。

ob_start();
while(!feof($fh)) {
       print(fread($fh, $chunk_size));
       flush();
       ob_flush();
       sleep(1);
    }
于 2011-10-18T17:17:20.003 に答える
0

ここで提案されているように、n バイトを読み取ってから、sleep(1) を使用して 1 秒待つことができます。

于 2010-06-24T14:18:03.873 に答える