ftp_nb_get

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

ftp_nb_get从 FTP 服务器检索文件并将其写入本地文件(非阻塞)

描述

ftp_nb_get(
    FTP\Connection $ftp,
    string $local_filename,
    string $remote_filename,
    int $mode = FTP_BINARY,
    int $offset = 0
): int|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);
}
?>

在上面的示例中,newfile 比 FTP 服务器上的 README 小 100 字节,因为我们从偏移量 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){}
?>

您的本地文件可能只包含几千字节,并且后续的 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