勉強したことのメモ

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でjpg / png画像をAVIF形式の画像に変換する方法

PHPでjpg / png画像をAVIF形式の画像に変換しサーバに保存したい。W ...

PHPで「Call to undefined function mb_str_split()」エラーの対応方法

PHPにて「Fatal error: Uncaught Error: Call ...

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

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

DTIのVPS(PHP5系環境)にCakePHPを導入する方法

他社さんと連携して仕事をする際に「フレームワーク何か使いますか?」と聞かれて「使 ...

PHPで変数名を動的に変えて使う方法

変数名を動的に変えて使用したかった。 調べてみると可変変数というものがあり、希望 ...