勉強したことのメモ

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で画像にモザイクをかけて保存

やりたかった事はPHPで ・モザイク処理 ・元の画像とは別にファイル名をつけて保 ...

PHPで「ramsey/uuid」ライブラリを用いてUUIDを生成する方法

PHPでUUID(Universally Unique Identifier)を ...

PHPで複数の送信先に一括でメールを送る方法

PHPで複数の送信先に一括でメールを送信したかった。配列とかで指定するのかと思っ ...

PHPで改行を含むデータをCSV化する際に表示崩れを防ぐ方法

PHPで改行を含むデータをCSV化した場合、そのCSVファイルをエクセル等で開く ...

PHPからWebAPI(screendot)経由で他サイトのスクリーンショットを取得する方法

PHPで他サイトのスクリーンショットを取得したい。今回はライブラリは無しで実現し ...