PHP Display a percentage of progress of ftp_get?

2019-01-27 04:50发布

问题:

I have a working FTP file download script.
The files I am downloading will be about 2-4 GB per day.
I was wondering if there was a way to get the percent of the file where it's at?

I have looked on php.net and on here but I couldn't find any similar questions and rather spend more time looking I figure I would ask people much smarter than myself.

I was thinking about if there was a function to see where it's at in the download, but I couldn't find one since ftp_get would have to complete first so that eliminated the chance of flushing the buffer every few seconds to display a new percent.

Anyone?

Here is my code: I hid all of my variables above it.

$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);

EDIT:

I added ftp_nb_get and here is my code for that. It keeps downloading fine, just doesn't echo it out to the browser.

$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);
}

回答1:

Try using the non-blocking version ftp_nb_get() and ftp_nb_continue() in a loop, and check for the saved file's size.



回答2:

It can be implemented easily using FTP URL protocol wrappers:

$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);

Regarding your attempts using ftp_nb_get:
The filesize caches the results, so calling it repeatedly will get you the same value. You have to call clearstatcache.

A full code is like:

$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";

Alternatively use ftp_nb_fget and query the file handle, like my first example.



回答3:

You should try buffer flush - ob_flush() and flush().

This technique works, I already used it. here is a tutorial

I am sure that you can wind yourself some more. Just google "progress php flush buffer"



标签: php ftp