PHP Загрузить файл, ограничить максимальную скорость и рассчитать скорость загрузки

Я написал сценарий, который дает вам возможность загружать файл с максимальной скоростью файла, которую я разрешаю, однако, когда я разрешаю «неограниченную» скорость, например, 10000 кБ / с, фант работает странно, он ведет себя так, как будто он загружается со скоростью 10000 кбит / с, что не соответствует действительности, и я не могу делать вычисления в базе данных, такие как время, текущая скорость загрузки и т. д. …

Таким образом, браузер загружает файл через некоторое время, но в базе данных он уже похож на «загружен», как я могу сделать некоторые вычисления точности, даже если установить неограниченную скорость, чтобы пользователь мог загрузить файл со скоростью сети, а значения базы данных также рассчитывается по его скорости сети не ftell(); который зависит от $download_rate; …?

Заранее спасибо!

 <?php while(!feof($fopen)) { //echo fread($fopen, 4096); $this->get_allowed_speed_limit($download_rate); //$download_rate = 350; print fread($fopen, round($download_rate * 1024)); sleep(1); //needed for download speed limit if(connection_status() != 0 || connection_aborted()) { $bytes_transferred = ftell($fopen); if($bytes_transferred < $bytes) { //CANCELLED $this->download_unsuccessfull($file_name); } else { //CANCELLED (but gets executed only on strange networks like eduroam in CZE) $this->download_unsuccessfull($file_name);} flush(); die; } else { $progress = ftell($fopen) / $bytes * 100; if($progress >= 100) { //DONE $this->download_successfull($file_name); flush(); } else { //DOWNLOADING if(ftell($fopen) != 0) { $bytes_transferred = ftell($fopen); $time_end = microtime(true); $time = $time_end - $time_start; $dl_speed = floor(($bytes_transferred / $time) / 1000); ///////HERE THE CALCULATIONS ARE TOTALLY WRONG, BECAUSE IT ALL DEPENDS ON THE INPUT OF $download_rate; mysqli_query($con, "UPDATE `download_meter` SET `current_speed` = '".mysqli_real_escape_string($con, $bytes_transferred)."'"); $this->update_active_downloads($file_name, $bytes_transferred, $dl_speed); } flush(); } } //Activate this for delay download. //flush(); //sleep(1); } ?> 

Ограниченная скорость загрузки зависит от вашего веб-сервера. PHP слишком высокий. Он ничего не знает об исходящих данных.

То же самое касается измерения: веб-сервер узнает и может как-то сказать вам. Журналы, unix-сокет, после факта, я не знаю. Эти ссылки будут знать.

Как насчет (повторного) добавления этого sleep(1); вещь в цикл WHILE ? Из того, что я вижу, скрипт выводит файл почти все сразу (как можно быстрее), и нет ничего, что бы приостановило его, чтобы он мог фактически ограничить скорость загрузки.

Таким образом, вы узнаете, что каждую секунду вы отправляете всего 64 килобайта (или что-то еще), и даже если вы не можете быть уверены, что пользователь может на самом деле получить это много данных / секунд (whoa, так быстро!), Это может быть немного точнее, чем у вас сейчас.

Или я ошибаюсь?