勉強したことのメモ

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

  関連記事

PhpSpreadsheetで文字色の変更、太字化、セルの色の変更を行う方法
PhpSpreadsheetで文字色の変更、太字化、セルの色の変更を行う方法

以前PHPとPhpSpreadsheetを用いてExcelシートを出力する方法を ...

wp_mail関数でエンベロープFrom(Return-Path)が指定できない場合の対応方法
wp_mail関数でエンベロープFrom(Return-Path)が指定できない場合の対応方法

WordPress内に設置されたお問い合わせのフォームようなシステムでエンベロー ...

PHPで配列を確認する際にvar_dumpよりも見やすくなるdBug.phpの利用方法
PHPで配列を確認する際にvar_dumpよりも見やすくなるdBug.phpの利用方法

PHPで配列を確認する際、大抵var_dumpで出力させているがこれが見づらい。 ...

PHPでログインフォームにひらがな認証を設置する方法
PHPでログインフォームにひらがな認証を設置する方法

ログインフォームに平仮名認証を設置したい。英数字認証だとSecurimageとい ...

eval関数について
eval関数について

ちょくちょく見ることがあったeval関数について、 なんとなく分かってきたのでメ ...