PHP Conference Japan 2024

ftp_nb_fget

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

ftp_nb_fget從 FTP 伺服器擷取檔案並將其寫入到已開啟的檔案 (非阻塞)

說明

ftp_nb_fget(
    FTP\Connection $ftp,
    資源 $stream,
    字串 $remote_filename,
    整數 $mode = FTP_BINARY,
    int $offset = 0
): int

ftp_nb_fget() 從 FTP 伺服器擷取遠端檔案。

此函式與 ftp_fget() 的不同之處在於,此函式以非同步方式擷取檔案,因此您的程式可以在檔案下載時執行其他操作。

參數

ftp

一個 FTP\Connection 實例。

stream

用於儲存資料的已開啟檔案指標。

remote_filename

遠端檔案路徑。

mode

傳輸模式。必須是 FTP_ASCIIFTP_BINARY

offset

開始下載的遠端檔案中的位置。

傳回值

傳回 FTP_FAILEDFTP_FINISHEDFTP_MOREDATA

更新日誌

版本 說明
8.1.0 ftp 參數現在需要一個 FTP\Connection 實例;以前需要一個 資源
7.3.0 mode 參數現在是可選的。以前是必需的。

範例

範例 #1 ftp_nb_fget() 範例

<?php

// 開啟一個檔案以供寫入
$file = 'index.php';
$fp = fopen($file, 'w');

$ftp = ftp_connect($ftp_server);

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

// 開始下載
$ret = ftp_nb_fget($ftp, $fp, $file, FTP_BINARY);
while (
$ret == FTP_MOREDATA) {

// 做任何你想做的事
echo ".";

// 繼續下載...
$ret = ftp_nb_continue($ftp);
}
if (
$ret != FTP_FINISHED) {
echo
"下載檔案時發生錯誤...";
exit(
1);
}

// 關閉檔案指標
fclose($fp);
?>

參見

  • ftp_nb_get() - 從 FTP 伺服器擷取檔案並將其寫入到本地檔案(非阻塞)
  • ftp_nb_continue() - 繼續擷取/傳送檔案(非阻塞)
  • ftp_fget() - 從 FTP 伺服器下載檔案並儲存至已開啟的檔案
  • ftp_get() - 從 FTP 伺服器下載檔案

新增註解

使用者貢獻的註解 1 則註解

6
pilif at pilif dot ch
20 年前
如果您想監控下載進度,可以使用 filesize() 函式。

但請注意:該函式的結果會被快取,所以您總是會得到 0 位元組。在呼叫 filesize() 以確定已下載檔案的實際大小之前,請先呼叫 clearstatcache()。

這可能會影響效能,但如果您想提供資訊,這是不可避免的。

以上範例延伸

<?php
// 取得遠端檔案的大小
$fs = ftp_size($my_connection, "test");

// 開始下載
$ret = ftp_nb_get($my_connection, "test", "README", FTP_BINARY);
while (
$ret == FTP_MOREDATA) {

clearstatcache(); // <- 這很重要
$dld = filesize($locfile);
if (
$dld > 0 ){
// 計算百分比
$i = ($dld/$fs)*100;
printf("\r\t%d%% 已下載", $i);
}

// 繼續下載...
$ret = ftp_nb_continue ($my_connection);
}
if (
$ret != FTP_FINISHED) {
echo
"下載檔案時發生錯誤...";
exit(
1);
}
?>

Philip
To Top