2011-05-14 25 views

回答

2

这就是我如何对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"; 

} 
1
  1. 转移之前,将当前时间戳放入一个变量。
  2. 确定要传输的文件的大小。
  3. 使用ftp函数传输文件
  4. 获取另一个时间戳并从第一个时间戳中减去该文件。
  5. 将文件大小除以结果,然后得到kb/sec。

例子:

$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 

这基本上给你的转移后的速度。如果您希望转移时的速度,还有其他方法可以做到。

+0

如果您将文件大小除以第二个时间戳和第一个时间戳之间的差值,则会得到每秒的字节数,而不是每秒的千字节数。 – icktoofay 2011-05-14 21:32:31

+0

非常真实,但它基本上完成了这项工作。我会详细说明。 – Bjoern 2011-05-14 21:41:57

6

使用非阻塞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()上传,你将有ftp_size($ftp2,$filename),其中$ftp2必须是第二更换filesize($filename) ,相同的连接,仅用于请求远程文件的大小,因为ftp_size()不适用于您的主连接,而非阻塞传输正在进行中。