2024 日本 PHP 研討會

ftp_nb_get

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

ftp_nb_get從 FTP 伺服器擷取檔案並將其寫入到本機檔案 (非阻塞)

說明

ftp_nb_get(
    FTP\Connection $ftp,
    字串 $local_filename,
    字串 $remote_filename,
    整數 $mode = FTP_BINARY,
    整數 $offset = 0
): 整數|false

ftp_nb_get() 從 FTP 伺服器擷取遠端檔案,並將其儲存到本機檔案。

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

參數

ftp

一個 FTP\Connection 實例。

local_filename

本機檔案路徑(如果檔案已存在,則會被覆蓋)。

remote_filename

遠端檔案路徑。

mode

傳輸模式。必須是 FTP_ASCIIFTP_BINARY

offset

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

返回值

返回 FTP_FAILEDFTP_FINISHEDFTP_MOREDATA,如果開啟本機檔案失敗,則返回 false

更新日誌

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

範例

範例 #1 ftp_nb_get() 範例

<?php

// 初始化下載
$ret = ftp_nb_get($ftp, "test", "README", FTP_BINARY);
while (
$ret == FTP_MOREDATA) {

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

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

範例 #2 使用 ftp_nb_get() 恢復下載

<?php

// 初始化
$ret = ftp_nb_get($ftp, "test", "README", FTP_BINARY,
filesize("test"));
// 或: $ret = ftp_nb_get($ftp, "test", "README",
// FTP_BINARY, FTP_AUTORESUME);
while ($ret == FTP_MOREDATA) {

// 執行您想做的任何事
echo ".";

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

範例 #3 使用 ftp_nb_get() 從位置 100 恢復下載到新檔案

<?php

// 關閉自動搜尋
ftp_set_option($ftp, FTP_AUTOSEEK, false);

// 初始化
$ret = ftp_nb_get($ftp, "newfile", "README", FTP_BINARY, 100);
while (
$ret == FTP_MOREDATA) {

/* ... */

// 繼續下載...
$ret = ftp_nb_continue($ftp);
}
?>

在上面的例子中,因為我們從偏移量 100 開始讀取,所以 newfile 比 FTP 伺服器上的 README 小 100 個位元組。如果我們沒有停用 FTP_AUTOSEEKnewfile 的前 100 個位元組將會是 '\0'

參見

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

新增筆記

使用者貢獻的筆記 1 則筆記

-1
passerbyxp at gmail dot com
12 年前
請注意,您可能需要持續呼叫 ftp_nb_continue 才能完成下載。例如,如果您這樣做:

<?php
ftp_nb_get
($conn,$localfile,$remotefile,FTP_BINARY)
//執行一些耗時的工作
while(ftp_nb_continue($conn)!=FTP_FINISHED){}
?>

您的本地檔案可能只包含幾 KB,而後續的 ftp_nb_continue 會持續發出沒有更多資料的警告(我猜是因為連線逾時)。

所以您可能想改成這樣做:

<?php
$dl
=ftp_nb_get($conn,$localfile,$remotefile,FTP_BINARY)
//部分耗時的工作
if(ftp_nb_continue($conn)==FTP_MOREDATA) {}
//部分耗時的工作
if(ftp_nb_continue($conn)==FTP_MOREDATA) {}
//繼續這樣做,直到完成耗時的工作
while(ftp_nb_continue($conn)==FTP_MOREDATA){}
?>

這發生在我的 Windows XP + PHP 5.3.8 的 CLI 環境下。希望這對某些人有所幫助。
To Top