PHP显示ftp_get的进度百分比是多少?(PHP Display a percentage of

2019-06-27 15:11发布

我有一个工作FTP文件下载脚本。
我下载的文件将是每天约2-4 GB。
我在想,如果有一种方式来获得它是在文件的百分比?

我已经看着php.net并在这里,但我找不到任何类似的问题,相当花更多的时间去寻找我想我会问的人比我聪明得多。

我在想,如果有,看看它是在下载的功能,但我无法找到一个,因为ftp_get必须完成第一,这样消除刷新缓冲区每隔几秒钟,以显示新的百分比的机会。

任何人?

这里是我的代码:我躲在我的所有变量的上面。

$conn_id = ftp_connect($ftp_server);

$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
    echo "Successfully written to $local_file\n";
} else {
    echo "There was a problem\n";
}

ftp_close($conn_id);

编辑:

我加入ftp_nb_get这里是我的代码。 它使下载罚款,只是没有回音出来给浏览器。

$ret = ftp_nb_get($conn_id, $local_file, $server_file, FTP_BINARY, $size);
while ($ret == FTP_MOREDATA) {
  echo round((filesize($local_file)/$server_size)*100)."%\n";
  $ret = ftp_nb_continue($conn_id);
}

Answer 1:

尝试使用非阻塞版本ftp_nb_get()ftp_nb_continue()在一个循环,并检查保存的文件的大小。



Answer 2:

它可以很容易地使用来实现FTP URL协议封装 :

$url = "ftp://username:password@ftp.example.com/remote/source/path/file.zip";

$size = filesize($url) or die("Cannot retrieve size file");

$hin = fopen($url, "rb") or die("Cannot open source file");
$hout = fopen("/local/dest/path/file.zip", "wb") or die("Cannot open destination file");

while (!feof($hin))
{
    $buf = fread($hin, 10240);
    fwrite($hout, $buf);
    echo "\r".intval(ftell($hout)/$size*100)."%";
}

echo "\n";

fclose($hout);
fclose($hin);

关于使用您尝试ftp_nb_get
filesize缓存的结果,所以调用它反复,会得到相同的值。 你必须调用clearstatcache

一个完整的代码如下:

$conn_id = ftp_connect("ftp.example.com");
ftp_login($conn_id, "username", "password");

ftp_pasv($conn_id, true);

$local_path = "/local/dest/path/file.zip";
$remote_path = "/remote/source/path/file.zip";
$size = ftp_size($conn_id, $remote_path);

$ret = ftp_nb_get($conn_id, $local_path, $remote_path, FTP_BINARY);

while ($ret == FTP_MOREDATA)
{
  clearstatcache(false, $local_path);
  echo "\r".intval(filesize($local_path)/$size*100)."%";
  $ret = ftp_nb_continue($conn_id);
}

echo "\n";

或者使用ftp_nb_fget和查询文件句柄,像我的第一个例子。



Answer 3:

你应该尝试缓冲区刷新 - 使用ob_flush()和flush()。

这种技术,我已经使用过它。 这里是一个教程

我相信,你可以自己风多一些。 只是谷歌“进步PHP的刷新缓冲区”



文章来源: PHP Display a percentage of progress of ftp_get?
标签: php ftp