2
A
回答
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
- 轉移之前,將當前時間戳放入一個變量。
- 確定要傳輸的文件的大小。
- 使用
ftp
函數傳輸文件 - 獲取另一個時間戳並從第一個時間戳中減去該文件。
- 將文件大小除以結果,然後得到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
這基本上給你的轉移後的速度。如果您希望轉移時的速度,還有其他方法可以做到。
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()
不適用於您的主連接,而非阻塞傳輸正在進行中。
相關問題
- 1. PHP FTP傳輸量
- 2. 無法通過PHP連接到ftp
- 3. 通過ftp連接到wamp
- 4. 如何使ftp連接需要隱式FTP通過TLS在php中
- 5. FTP上傳到PHP
- 6. 通過PHP頁面上傳FTP上傳
- 7. 使用PHP測試FTP連接
- 8. PHP如何連接使用隱式FTP通過TLS
- 9. 使用PHP通過FTP上傳文件
- 10. 通過PHP FTP上傳整個目錄
- 11. 通過FTP在php上傳文件
- 12. FTP通過PHP上傳和下載
- 13. 如何通過NSTask檢查FTP連接?
- 14. 擊/ FTP:如何通過FTP
- 15. 如何監視通過Perl代碼傳輸FTP的進度?
- 16. Android如何連接到FTP?
- 17. 如何在PHP中通過ftp上傳文件?
- 18. 如何通過FTP使用PHP上傳文件的URL?
- 19. 重命名()文件通過PHP與服務器FTP連接
- 20. 通過衛星FTP /高延遲連接的FTP
- 21. 如何通過FTP上傳文件夾PHP
- 22. 如何在PHP中通過ftp找到文件?
- 23. 阻止通過FTP連接的IP
- 24. 如何通過ftp
- 25. 用FTP上傳的PHP
- 26. 使用PHP上傳一個文件夾通過FTP使用PHP
- 27. 使用PHP通過FTP上傳實時文件
- 28. 通過Powershell從.csv輸入FTP上傳
- 29. 通過傳輸ftp破壞xml文件
如果您將文件大小除以第二個時間戳和第一個時間戳之間的差值,則會得到每秒的字節數,而不是每秒的千字節數。 – icktoofay 2011-05-14 21:32:31
非常真實,但它基本上完成了這項工作。我會詳細說明。 – Bjoern 2011-05-14 21:41:57