PHP Conference Japan 2024

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_AUTOSEEK,则 newfile 的前 100 个字节将是 '\0'

参见

  • ftp_nb_fget() - 从 FTP 服务器检索文件并将其写入打开的文件(非阻塞)
  • ftp_nb_continue() - 继续检索/发送文件(非阻塞)
  • ftp_fget() - 从 FTP 服务器下载文件并保存到打开的文件
  • ftp_get() - 从 FTP 服务器下载文件

添加注释

用户贡献的注释 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