PHP Conference Japan 2024

ftp_nb_put

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

ftp_nb_put将文件存储到 FTP 服务器(非阻塞)

描述

ftp_nb_put(
    FTP\Connection $ftp,
    string $remote_filename,
    string $local_filename,
    int $mode = FTP_BINARY,
    int $offset = 0
): int|false

ftp_nb_put() 将本地文件存储到 FTP 服务器上。

此函数与 ftp_put() 的区别在于,此函数异步上传文件,因此您的程序可以在文件上传期间执行其他操作。

参数

ftp

一个 FTP\Connection 实例。

remote_filename

远程文件路径。

local_filename

本地文件路径。

mode

传输模式。必须是 FTP_ASCIIFTP_BINARY

offset

开始上传到的远程文件中的位置。

返回值

返回 FTP_FAILEDFTP_FINISHEDFTP_MOREDATA,或者在无法打开本地文件时返回 false

变更日志

版本 描述
8.1.0 ftp 参数现在期望一个 FTP\Connection 实例;以前,期望一个 资源
7.3.0 mode 参数现在是可选的。以前它是必须的。

示例

示例 #1 ftp_nb_put() 示例

<?php

// 开始上传
$ret = ftp_nb_put($ftp, "test.remote", "test.local", FTP_BINARY);
while (
$ret == FTP_MOREDATA) {

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

// 继续上传...
$ret = ftp_nb_continue($ftp);
}
if (
$ret != FTP_FINISHED) {
echo
"上传文件时出现错误...";
exit(
1);
}
?>

示例 #2 使用 ftp_nb_put() 恢复上传

<?php

// 初始化
$ret = ftp_nb_put($ftp, "test.remote", "test.local",
FTP_BINARY, ftp_size("test.remote"));
// 或者:$ret = ftp_nb_put($ftp, "test.remote", "test.local",
// FTP_BINARY, FTP_AUTORESUME);

while ($ret == FTP_MOREDATA) {

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

// 继续上传...
$ret = ftp_nb_continue($ftp);
}
if (
$ret != FTP_FINISHED) {
echo
"上传文件时出现错误...";
exit(
1);
}
?>

参见

添加注释

用户贡献的笔记 6 个笔记

3
ted at hostleft dot com
19 年前
如果您收到类似以下的错误

警告:ftp_nb_put():无法在 /path/to/file.php 的第 27 行中为 PORT 命令提供服务

验证您是否需要处于 PASV 模式。您可以通过声明以下内容进入 PASV 模式

> ftp_pasv($cnx,TRUE);
3
manu at manux dot org
19 年前
在使用非阻塞函数时,如果您尝试在非阻塞操作正在进行时断开连接,则断开连接命令将无法工作,直到操作完成。
3
Ariel asphp at dsgml dot com
18 年前
不要在循环内添加 sleep()。如果您这样做,会严重降低上传速度。

在我的测试中,每次循环发送大约 2.5K,每秒循环大约 220 次。(这非常少。)

您不一定能获得与我相同的每次循环数字,但显然 PHP 对循环进行了自己的管理,以便您不会消耗服务器上的所有 CPU。
1
WebSee.ru
15 年前
如何实现通过 FXP 将数据从一台 FTP 服务器传输到另一台 FTP 服务器的可能性



<?php
// ...

$ansver = ftp_raw($ftp_conn1, 'PASV');

if (
intval($ansver[0]) == 227) {
ftp_raw($ftp_conn2, 'PORT '.substr($ansver[0], $n = strpos($ansver[0], '(') + 1, strpos($m[0], ')', $n) - $n));
ftp_raw($ftp_conn1, 'STOR '.$filename); // 需要异步(非阻塞)
ftp_raw($ftp_conn2, 'RETR '.$filename);
}
?>
-1
kaiohken1982 at hotmail dot com
18 年前
您好,
我尝试使用 ftp_put() 和 ftp_nb_put(),并在脚本开头添加
变量 $start = date("Y:m:d h:i:s"); 并在文件上传函数之后,脚本结尾添加变量 $end = date("Y:m:d h:i:s");。
我目前使用的是 GPRS 连接,尝试上传一个 67.5KB 的 .jpg 文件,在这两种情况下,$start 和 $end 之间的时间差都是 40 秒,所以我可以假设这两个上传函数之间没有区别。
如果在 while ($ftp_upload == FTP_MOREDATA) 循环中添加任何内容,就会出现差异。
希望此说明能有所帮助。
此致
-1
brandon dot farber at gmail dot com
18 年前
我之前没有注意到这一点……

ftp_nb_put 上传文件的时间明显比 ftp_put 长得多(我没有进行任何数据包嗅探或日志测试来找出原因)。我使用了一个与上面示例几乎相同的脚本,一个 100KB 的文件在大约 8 分钟后只上传了 3.99KB!PHP 脚本自然超时,无法完成。

我将函数更改为使用 ftp_put,去掉了检查 FTP_MOREDATA 的循环(如上例所示),并且相同的脚本在没有任何其他更改的情况下在 30 秒内上传了 2.2MB。

如果您使用此函数而不是 ftp_put *仅仅是为了尝试加快脚本速度*,并且它花费了很长时间,您可能需要尝试使用 ftp_put。
To Top