2013-08-31 3 views
1

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

Так браузер загружает файл через некоторое время, но в базе данных он уже похож на «загружен», как я могу сделать некоторые расчеты точности, даже если установить неограниченную скорость, чтобы пользователь мог загрузить файл со скоростью сети, а значения базы данных также учитываются его скоростью сети, а не 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); 
    } 
?> 
+0

Я не думаю, что сервер может узнать скорость загрузки клиента. Возможно, на веб-сервере, но не на PHP. Может быть, проверить клиента с JS? – Rudie

+0

Как серверы fileshare предлагают файлы клиенту с ограничением скорости? –

+0

Вы хотите ограничить скорость загрузки? Это не должно быть сложно. Я думал, ты хочешь это измерить. И вы действительно сравниваете свои обширные навыки PHP с профессиональным файловым сервером SERVER? Да, они могут это сделать. – Rudie

ответ

1

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

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

+0

Nginx - мой выбор, спасибо, но как я могу ограничить скорость на ходу? Я хотел сделать это с помощью php, потому что я хотел написать робота, который будет настраивать максимальную скорость загрузки, когда это возможно, и оптимизировать его с более одновременными клиентами. –

+0

Возможно, Nginx может изменить время выполнения ..? Вероятно, не ** во время ** загрузки, но для каждого запроса по-разному. Каким бы ни было решение, он будет ориентирован на веб-сервер. – Rudie

+0

И следующее: я могу ограничить его с помощью php, но я хотел бы проследить, сколько переданных байтов, вычислить расчетное время загрузки и играть с базой данных, что php позволяет мне делать это хорошо, если бы я знал путь. –

0

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

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

Или я получаю это неправильно?

+0

Спасибо за ваш ответ! Не похоже, что он работает, начал загрузку с 1000 кбит/с, это было прекрасно, а затем изменилась скорость на ходу до 10000 кбит/с, и это показало, что 50% файлов было загружено, а на самом деле было загружено только 20 мб из 100, что говорит мне мои расчеты неверны для деталей клиентских браузеров:/ –

+0

Я пытаюсь установить $ download_rate как 10mbps, но соединение пользователя точно так же, как 1mbps, поэтому я не хочу ошибочно вычислять, хотел бы пересчитать скорость загрузки клиентов и установить предел для он, но я не могу пересчитать это, так как это зависит от $ download_rate, который я установил, humm ... Jo ty jsi taky cech ^^ –

+0

Так вы, в основном, с другой стороны лимита загрузки. Ну, это тяжело.Я не могу придумать, как перейти к фактической скорости загрузки, с точки зрения пользователя, потому что PHP похож на серверную. Я определенно попытаюсь что-то вырвать. – Smuuf

Смежные вопросы