勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPでファイルのダウンロード時に速度制限をかける方法(分割ダウンロード)

  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で制限をかける場合はこちらのサイトが参考になりそう。

 

参考サイト

https://every-rating.com/php/php.html

https://takahashifumiki.com/web/programing/2192/

 - PHP

  関連記事

PHPでeval実行時に「eval()'d code on line」エラー
PHPでeval実行時に「eval()'d code on line」エラー

PHPでeval実行時に「eval()'d code on line 〇〇」とい ...

PHPで簡単にカレンダーを生成できるライブラリ「PHP Calendar」の利用方法
PHPで簡単にカレンダーを生成できるライブラリ「PHP Calendar」の利用方法

PHPでカレンダーを描写したいということがたまにある。今までバニラPHPで書いて ...

PHPでパスワードを保存する際に暗号(パスワードハッシュ)化させ、ログイン認証時に用いる方法
PHPでパスワードを保存する際に暗号(パスワードハッシュ)化させ、ログイン認証時に用いる方法

PHPでログイン認証を組み込む際に今までは特に暗号化は行っていなかった。と言うの ...

MySQLでIPを整数値としてカラムに格納する
MySQLでIPを整数値としてカラムに格納する

MySQLでIPを整数値としてカラムに格納しているケースがあった。今までIPが必 ...

バニラPHPでフラッシュデータ(フラッシュメッセージ)機能を実装する方法
バニラPHPでフラッシュデータ(フラッシュメッセージ)機能を実装する方法

PHPフレームワークのCodeIgniterを勉強していた際にページ遷移好みに表 ...