Как измерить скорость передачи FTP в PHP при подключении к FTP через функции PHP - PullRequest
2 голосов
/ 15 мая 2011

Я подключен к серверу через функции PHP ftp_.

Как измерить скорость передачи?

Ответы [ 3 ]

6 голосов
/ 15 мая 2011

Используйте неблокирующие функции ftp, чтобы загрузить файл и рассчитать разницу во времени и размере файла. Ниже приведена простая демонстрация с экспоненциальным сглаживанием для предотвращения слишком большого скачка скорости:

define('ALPHA', 0.2); // Weight factor of new calculations, between 0 and 1
$ftp = ftp_connect(...);
$tmp = ftp_nb_get($ftp, $filename, $filename, FTP_BINARY);
$transferred = 0;
$rate = 0;
$time = microtime(true);
while ($tmp == FTP_MOREDATA) {
   $tmp = ftp_nb_continue($ftp);

   $timeNow = microtime(true);
   $sizeNow = filesize($filename);
   $currentRate = ($sizeNow - $transferred) / ($timeNow - $time);
   $rate = ALPHA * $currentRate + (1 - ALPHA) * $rate;
   $time = $timeNow;
   $transferred = $sizeNow;

   echo "Current transfer speed: $rate B/s\n";
}

Если вы хотите то же самое для ftp_nb_put() загрузки, вам придется заменить filesize($filename) на ftp_size($ftp2,$filename), где $ftp2 должно быть вторым идентичным соединением, используемым только для запроса размера удаленного файла. , поскольку ftp_size() не будет работать с вашим основным подключением, пока выполняется неблокирующая передача.

2 голосов
/ 31 мая 2011

Вот как я жестоко обращался с кодом phihag для проверки скорости загрузки без блокировки. Вы не можете использовать ftp_size(), пока идет неблокирующая передача, поэтому для этой цели вам нужно дополнительное соединение. Я показываю текущую скорость, среднюю скорость, прошедшее время и приблизительное оставшееся время.

$primary_connection = ftp_connect($server);
$secondary_connection = ftp_connect($server);

$mode = FTP_BINARY;
$login = ftp_login($primary_connection, $ftp_user_name, $ftp_user_pass);
$login2 = ftp_login($secondary_connection, $ftp_user_name, $ftp_user_pass);

if (!$primary_connection || !$login) { die('Connection attempt failed!'); }
ftp_pasv($primary_connection,TRUE);
ftp_pasv($secondary_connection,TRUE);

$upload_status=ftp_nb_put($primary_connection, $destination_file, $source_file, $mode);

define('ALPHA', 0.2); // Weight factor of new calculations, between 0 and 1
$filesize=filesize($source_file);
$transferred = 0;
$rate = 0;
$time = microtime(true);

$start_time=$time;

while($upload_status == FTP_MOREDATA){

    $upload_status = ftp_nb_continue($primary_connection);

    $sizeNow=ftp_size($secondary_connection,$destination_file);
    $sizeNowkB=$sizeNow/1024;
    $timeNow = microtime(true);

    $currentRate = ($sizeNow - $transferred) / ($timeNow - $time);
    $currentkBRate = $currentRate / 1024;

    $rate = ALPHA * $currentRate + (1 - ALPHA) * $rate;
    $time = $timeNow;
    $transferred = $sizeNow;

    printf("Uploading file: %s",$source_file);
    echo "<br>\n";

    printf( "To be transferred: %0.2f kB", $filesize/1024);
    echo "<br>\n";

    printf( "Transferred: %0.2f kB", $sizeNowkB);
    echo "<br>\n";

    printf( "Current speed: %0.2f kB/s", $currentkBRate);
    echo "<br>\n";

    printf( "Average speed: %0.2f kB/s", $rate/1024);
    echo "<br>\n";

    $elapsed_time=$timeNow - $start_time;
    printf( "Elapsed time: %0.2f s", $elapsed_time);
    echo "<br>\n";

    if($rate!=0){
        $eta=$filesize/$rate - $elapsed_time;
    }else{
        $eta=0.0;
    }
    if($eta<=0){
        $eta=0.0;
    };
    printf( "Estimated time left: %0.2f s", $eta);
    echo "<br>\n";

}
2 голосов
/ 15 мая 2011
  1. Перед передачей поместите текущую метку времени в переменную.
  2. Определите размер файла, который вы хотите передать.
  3. Передача файла с функциями ftp
  4. Получить другую временную метку и вычесть ее из первой временной метки.
  5. Разделите размер файла с результатом, тогда у вас будет кбит / с.

Пример:

$start = mktime(); // 1
$size = filesize('yourfile.txt') / 1024 ; // 2 <- to get the KB 

... do your transfer... // 3

//after ftp transfer 
$stop = mktime(); // 4
$duration = $stop - $start; 
$speed = $size / $duration; // 5

Это в основном дает вам скорость после передачи. Если вам нужна скорость при передаче, есть другие способы сделать это.

...