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. 通过ftp与PHP连接
- 3. PHP FTP传输量
- 4. 无法通过PHP连接到ftp
- 5. PHP FTP传输
- 6. 如何通过PHP中的cURL获取FTP最大连接数?
- 7. 通过FTP连接到FTP://用含有@
- 8. 如何使用ftp连接通过PHP cURL上传文件?
- 9. FTP通过php - 连接重置
- 10. php通过ftp大量上传
- 11. ftp:限制传输速度
- 12. 通过ftp连接到wamp
- 13. 我如何加快PHP的FTP速度
- 14. PHP - 验证FTP连接 - 检测FTP超时
- 15. 如何使ftp连接需要隐式FTP通过TLS在php中
- 16. FTP上传到PHP
- 17. 连接与FTP通过RSE在FTP
- 18. 使用PHP测试FTP连接
- 19. 通过PHP的FTP错误
- 20. PHP如何连接使用隐式FTP通过TLS
- 21. PHP ftp连接方法
- 22. 使用PHP通过FTP上传文件
- 23. 通过FTP在php上传文件
- 24. 通过PHP上传FTP表格
- 25. FTP通过PHP上传和下载
- 26. 通过PHP FTP上传整个目录
- 27. 如何通过NSTask检查FTP连接?
- 28. 击/ FTP:如何通过FTP
- 29. PHP连接到FTP服务器
如果您将文件大小除以第二个时间戳和第一个时间戳之间的差值,则会得到每秒的字节数,而不是每秒的千字节数。 – icktoofay 2011-05-14 21:32:31
非常真实,但它基本上完成了这项工作。我会详细说明。 – Bjoern 2011-05-14 21:41:57