Вот как я жестоко обращался с кодом 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";
}