ファイルのダウンロードの進行状況バー機能を実装するなど、何らかの目的でファイルのダウンロード速度を遅くする必要がある場合があります。ダウンロード速度を制限する最大の利点は、帯域幅を節約し、過度の瞬間的なトラフィックによって引き起こされるネットワークの混雑を回避することです。この記事では、PHP コードを通じてファイルのダウンロード速度を制限する方法を紹介します。
まず、php を使用してファイルのダウンロード速度を制限するコードを見てみましょう:
<?php // 将发送到客户端的本地文件 $local_file='www.Alixixi.com.zip'; // 文件名 $download_file='your-download-name.zip'; // 设置下载速率(=> 31.2 kb/s) $download_rate=31.2; if(file_exists($local_file)&&is_file($local_file)){ header('Cache-control: private');// 发送 headers header('Content-Type: application/octet-stream'); header('Content-Length: '.filesize($local_file)); header('Content-Disposition: filename='.$download_file); flush();// 刷新内容 $file=fopen($local_file,"r"); while (!feof($file)){ print fread($file,round($download_rate*1024));// 发送当前部分文件给浏览者 flush();// flush 内容输出到浏览器端 sleep(1);// 终端1秒后继续 } fclose($file);// 关闭文件流 }else{ die('Error: 文件 '.$local_file.' 不存在!'); }
上記のコードを分析してみましょう:
上記の例では、ファイルのダウンロード速度が 31.2kb/s に制限されています。つまり、ファイル全体が送信されるまで、1 秒あたり 20.5kb のファイル ストリームのみがクライアントに送信されます。このような制限がない場合、受信できる限り多くのファイルがストリームでまとめてクライアントに送信されるとどうなるでしょうか?ファイル サイズが 2m の場合、2m のデータ ストリームを一度に送信するとネットワークが混雑し、スクリプトの実行が中断される可能性があります。このダウンロード方法は実際のアプリケーションでは使用できません。
技術的には、まずヘッダー ファイルを追加し、Content-Type を application/octet-stream として宣言して、リクエストがストリームとして送信されることを示します。次に、Content-Length を宣言して、ファイル ストリームのサイズを宣言します。 。コード内ではFlush()を使用しています。flush関数はphpプログラムのバッファを更新し、動的出力を実現します。
上記のファイルが存在するかどうかのチェックは file_exists 関数を使用して行われますが、この関数は現在のサーバー Web サイトのディレクトリに関連するファイルのみをチェックできることに注意してください。それがインターネット上のリモート ファイルである場合は、このサイトの次の記事 記事:
PHP にリモート ファイルが存在するかどうかを確認する方法
でファイルが存在するかどうかを確認します。
もう 1 つの注意事項: 上記のコードをうまく使用すると、ファイルのダウンロードの進行状況バーを表示するクライアントの機能も実現できます。興味のある方は試してみてください。ただし、ここでは詳しくは書きません。