2011-05-14 49 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()不適用於您的主連接,而非阻塞傳輸正在進行中。