Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当通过PHP函数连接到FTP时,如何在PHP中测量FTP传输速度_Php_Ftp_Benchmarking - Fatal编程技术网

当通过PHP函数连接到FTP时,如何在PHP中测量FTP传输速度

当通过PHP函数连接到FTP时,如何在PHP中测量FTP传输速度,php,ftp,benchmarking,Php,Ftp,Benchmarking,我通过PHPftp\uu函数连接到服务器 如何测量传输速度 在传输之前,将当前时间戳放入变量中 确定要传输的文件的大小 使用ftp功能传输文件 获取另一个时间戳并从第一个时间戳中减去它 将文件大小除以结果,就得到了kb/秒 例如: $start = mktime(); // 1 $size = filesize('yourfile.txt') / 1024 ; // 2 <- to get the KB ... do your transfer... // 3 //after ftp

我通过PHP
ftp\uu
函数连接到服务器

如何测量传输速度

  • 在传输之前,将当前时间戳放入变量中
  • 确定要传输的文件的大小
  • 使用
    ftp
    功能传输文件
  • 获取另一个时间戳并从第一个时间戳中减去它
  • 将文件大小除以结果,就得到了kb/秒
  • 例如:

    $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
    
    $start=mktime();//1.
    
    $size=filesize('yourfile.txt')/1024;//2使用非阻塞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\u nb\u put()
    上传使用相同的内容,则必须将
    filesize($filename)
    替换为
    ftp\u size($ftp2,$filename)
    ,其中
    $ftp2
    必须是第二个相同的连接,用于请求远程文件的大小,因为
    ftp\u size()
    在进行非阻塞传输时,将无法与您的主连接一起工作。

    这就是我如何残忍地使用phihag的代码来检查非阻塞上传速度的方法。当非阻塞传输正在进行时,您不能使用
    ftp\u 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";
    
    }
    
    $primary\u connection=ftp\u connect($server);
    $secondary\u connection=ftp\u connect($server);
    $mode=FTP\u二进制文件;
    $login=ftp\u login($primary\u connection,$ftp\u user\u name,$ftp\u user\u pass);
    $login2=ftp\u登录($secondary\u connection,$ftp\u user\u name,$ftp\u user\u pass);
    if(!$primary_connection | |!$login){die('connection-truction-failed!');}
    ftp_pasv($primary_connection,TRUE);
    ftp_pasv($secondary_connection,TRUE);
    $upload\u status=ftp\u nb\u put($primary\u connection,$destination\u file,$source\u file,$mode);
    定义('ALPHA',0.2);//新计算的权重因子,介于0和1之间
    $filesize=filesize($source\u file);
    $transfered=0;
    $rate=0;
    $time=microtime(真);
    $start_time=$time;
    while($upload\u status==FTP\u MOREDATA){
    $upload\u status=ftp\u nb\u continue($primary\u connection);
    $sizeNow=ftp\u大小($secondary\u connection,$destination\u file);
    $sizeNowkB=$sizeNow/1024;
    $timeNow=微时间(真);
    $currentRate=($sizeNow-$Transfer)/($timeNow-$time);
    $currentkBRate=$currentRate/1024;
    $rate=ALPHA*$currentRate+(1-ALPHA)*$rate;
    $time=$timeNow;
    $transfered=$sizeNow;
    printf(“上载文件:%s”,$source\u文件);
    回声“
    \n”; printf(“待传输:%0.2f kB”,$filesize/1024); 回声“
    \n”; printf(“已传输:%0.2f kB”,$sizeNowkB); 回声“
    \n”; printf(“当前速度:%0.2f kB/s”,$currentkBRate); 回声“
    \n”; printf(“平均速度:%0.2f kB/s”,$rate/1024); 回声“
    \n”; $Expased_time=$timeNow-$start_time; printf(“已用时间:%0.2f s”,$已用时间); 回声“
    \n”; 如果($rate!=0){ $eta=$filesize/$rate-$eassed\u time; }否则{ $eta=0.0; }
    如果将文件大小除以第二个时间戳和第一个时间戳之间的差值,则得到的是每秒字节数,而不是每秒千字节数。非常正确,但基本上可以完成这项工作。我将详细说明。