我有一个可用的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);
}
尝试在循环中使用非阻塞版本ftp_nb_get()
和ftp_nb_continue()
,并检查保存的文件的大小。
它可以使用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
并查询文件句柄,就像我的第一个例子一样。
您应该尝试缓冲区刷新-ob_flush()和flush()。
这个技巧很管用,我已经用过了。这是教程
我相信你可以多放松一下。只需谷歌"progress php flush buffer"