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で制限をかける場合はこちらのサイトが参考になりそう。
参考サイト
関連記事
-
-
PHP8系の環境でdBug.phpライブラリが使用できない場合の対応方法
先日メモしたdBug.phpをPHP8系の環境で試すと動作しなかった。ただエラー ...
-
-
mysqldumpが使えないレンタルサーバでMySQLのバックアップ
mysqldumpが使えないレンタルサーバで開発を行うことがあり、尚且つ他社に使 ...
-
-
PHPでテンプレートPDFにリンク付きの文字を追記する方法(TCPDF&FPDI)
以前、PHPのTCPDF&FPDIを用いてテンプレートPDFに対し、動的 ...
-
-
PHPでステータスコードを取得する方法
サーバーの死活監視でUptimeRobotを使っていたけど、どうも正常に監視して ...
-
-
PHPにて「hashids(Sqids)」ライブラリで数値からユニークなランダム英数字のIDに変換する方法
PHPにてユーザID等を推測されないよう数値のIDからユニークなランダム英数字の ...