2

FTPファイルのダウンロードスクリプトが機能しています。
ダウンロードするファイルは、1日あたり約2〜4GBになります。
ファイルのパーセントを取得する方法があるかどうか疑問に思っていましたか?

私は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);
}
4

3 に答える 3

2

非ブロッキングバージョンftp_nb_get()ftp_nb_continue()ループで使用してみて、保存されたファイルのサイズを確認してください。

于 2012-08-31T13:15:48.390 に答える
0

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:キャッシュは結果をキャッシュするため、繰り返し呼び出すと同じ値が得られます。に電話する必要があります。
filesizeclearstatcache

完全なコードは次のようなものです。

$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または、最初の例のように、ファイルハンドルを使用してクエリを実行します。

于 2017-11-23T07:22:13.550 に答える
-1

バッファフラッシュを試す必要があります--ob_flush()およびflush()。

このテクニックは機能します、私はすでにそれを使用しました。 ここにチュートリアルがあります

もう少し自分を巻き上げることができると確信しています。ただグーグル「プログレスphpフラッシュバッファ」

于 2014-01-12T20:57:08.067 に答える