勉強したことのメモ

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

  関連記事

PHP7が2015年11月にリリースされるらしい
PHP7が2015年11月にリリースされるらしい

PHP7で変わること ——言語仕様とエンジンの改善ポイント from Yoshi ...

phpdotenvライブラリを使用してPHPで.envファイルを読み込ませる方法
phpdotenvライブラリを使用してPHPで.envファイルを読み込ませる方法

CodeIgniterを勉強していた際に各種設定は「.env」というファイルに記 ...

formにGoogle reCAPTCHA v3を組み込み、PHPでスコア判定する方法
formにGoogle reCAPTCHA v3を組み込み、PHPでスコア判定する方法

だいぶ前にGoogle reCAPTCHA v2をformに組み込むという記事を ...

PHPでExcelシートを出力する方法(PhpSpreadsheet)
PHPでExcelシートを出力する方法(PhpSpreadsheet)

PHPでエクセルシートを出力させたい。以前はPHPExcelを利用していたが現在 ...

PHPで「Warning: date(): It is not safe to…」エラーの対応方法
PHPで「Warning: date(): It is not safe to…」エラーの対応方法

PHPでdate関数を使った際に「Warning: date(): It is ...