PHPでファイルのダウンロード時に速度制限をかける方法(分割ダウンロード)
オンラインストレージサービス等で有料会員じゃない場合、ファイルのダウンロード時に「最大100kb / 秒」等の速度制限があったりする(有料会員の場合は速度制限なし)。このような機能をPHPで実装したい。以下に対応方法をメモ。
対応方法
ソースコード
<?php $file = '/root/path/test.zip'; header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename="'.basename($file).'"'); header('Content-Length: ' . filesize($file)); $handle = fopen($file, 'r'); while(!feof($handle)){ $bytes = fread($handle, 10000); //10000バイトずつ読み込み echo $bytes; flush(); usleep(100000); //0.1秒スリープ } fclose($handle); exit; ?>
上記ソースコードで試したところ当方の環境だと大体「最大100kb / 秒」ぐらいの速度になった。
制限をかけない場合
有料会員の場合は制限をかけない、といった場合はfreadの10000バイト部分の値を大きくするのと、usleepを無しにするよう分岐処理させると良さそう。
タイムアウトに注意
あまり大きいサイズのファイルだとタイムアウトになる可能性がある。そのためset_time_limit等でタイムアウト設定を行った方が良さそう。
所感
Apacheで制限をかける場合はこちらのサイトが参考になりそう。
参考サイト
関連記事
-
-
PHPで日時のフォーマットをISO 8601型とDateTime型を相互に変換する方法
他社のAPI等のレスポンスで日時部分が「YYYY-MM-DDTHH:II:SSZ ...
-
-
PHPで日時比較時の注意
PHPで日時を比較する際にミスがあったのでメモ。 基本形は下記。 $limit_ ...
-
-
PHPで縦横どちらかが指定の長さを超えた場合、比率を保ったままリサイズ
PHPで縦横どちらかが指定の長さを超えた場合、 比率を保ったままリサイズしたかっ ...
-
-
時間と数字のフォーマット
教わったのでメモ。 ・時間の整形 strtotime() 例) $ymd = ' ...
-
-
AjaxのJSONP使用でPHPで作った配列をJSに返す方法
AというサイトからBというサイトにAjax通信し、Bの方ではMySQLに接続して ...