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);
}
?>

参见

添加说明

用户贡献说明 7 说明

ted at hostleft dot com
19 年前
如果您收到以下错误:

Warning: ftp_nb_put(): Unable to service PORT commands in /path/to/file.php on line 27

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

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

在我的测试中,每次循环都会发送大约 2.5K 的数据,每秒循环大约 220 次。(这很少。)

您不会一定获得与我相同的循环次数,但很明显 PHP 自己管理循环,这样您就不会消耗服务器上的所有 CPU。
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);
}
?>
kaiohken1982 at hotmail dot com
17 年前
您好,
我尝试使用 `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)` 循环中添加任何内容,就会出现差异。
我希望这个说明能有所帮助。
此致
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`。
parasc at chetu dot com
5 年前
大家好,
`ftp_put` 在客户端服务器上无法正常工作,但在我的本地系统上可以正常工作。
客户端服务器上的问题
生产错误: `ftp_put(): I won't open a connection to 172.31.17.181 (only to 52.33.186.63).`

我的脚本从本地系统上传文件到远程服务器。

谢谢
Paras Chauhan
To Top