2012-08-31 214 views
1

我有一個可用的FTP文件下載腳本。
我下載的文件大約每天2-4 GB。
我想知道是否有一種方法來獲取文件的百分比?PHP顯示ftp_get進度的百分比?

我看過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); 
} 
+0

您可能最終會使用類似於此的方法:http://stackoverflow.com/questions/2885468/getting-ftp-put-progress作爲基本的ftp_put/get本身不支持任何形式的回調或通過ajax檢查中間結果。 – ahillman3

回答

1

嘗試在循環中使用非阻塞版本ftp_nb_get()ftp_nb_continue(),並檢查保存的文件的大小。

+0

謝謝,我現在就試試。 –

+0

我添加了一個編輯,你有什麼想法嗎? –

+0

PHP通常會緩衝輸出,嘗試在echo之後添加[flush()](http://php.net/manual/en/function.flush.php)以強制發送輸出。如果你使用outputbuffers,可能需要[ob_get_flush()](http://php.net/manual/en/function.ob-get-flush.php)或類似的東西。 – complex857

-1

你應該嘗試buffer flush - ob_flush()和flush()。

這項技術的工作原理,我已經使用它。 here is a tutorial

我相信你可以給自己多一些。 不僅僅是谷歌的「進步PHP刷新緩衝區」

0

可以實現輕鬆使用FTP URL protocol wrappers

$url = "ftp://username:[email protected]/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和查詢文件句柄,像我的第一個例子。