如果您收到以下错误:
Warning: ftp_nb_put(): Unable to service PORT commands in /path/to/file.php on line 27
验证您是否需要处于 PASV 模式。您可以通过声明以下内容进入 PASV 模式:
> ftp_pasv($cnx,TRUE);
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
ftp_nb_put — 将文件存储到 FTP 服务器(非阻塞)
$ftp
,$remote_filename
,$local_filename
,$mode
= FTP_BINARY
,$offset
= 0ftp_nb_put() 将本地文件存储到 FTP 服务器。
此函数与 ftp_put() 之间的区别在于,此函数以异步方式上传文件,因此程序可以在文件上传时执行其他操作。
ftp
一个 FTP\Connection 实例。
remote_filename
远程文件路径。
local_filename
本地文件路径。
mode
传输模式。必须是 FTP_ASCII
或 FTP_BINARY
。
offset
远程文件开始上传的位置。
返回 FTP_FAILED
或 FTP_FINISHED
或 FTP_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);
}
?>
如果您收到以下错误:
Warning: ftp_nb_put(): Unable to service PORT commands in /path/to/file.php on line 27
验证您是否需要处于 PASV 模式。您可以通过声明以下内容进入 PASV 模式:
> ftp_pasv($cnx,TRUE);
不要在循环内添加 sleep()。如果您这样做,您将严重降低上传速度。
在我的测试中,每次循环都会发送大约 2.5K 的数据,每秒循环大约 220 次。(这很少。)
您不会一定获得与我相同的循环次数,但很明显 PHP 自己管理循环,这样您就不会消耗服务器上的所有 CPU。
如何实现通过 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);
}
?>
您好,
我尝试使用 `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)` 循环中添加任何内容,就会出现差异。
我希望这个说明能有所帮助。
此致
我之前没有注意到这一点...
`ftp_nb_put` 上传文件的时间明显比 `ftp_put` 长很多(我没有进行任何数据包嗅探或日志记录测试来找出原因)。我使用了一个与上面示例几乎相同的脚本,一个 100KB 的文件在大约 8 分钟后只上传了 3.99KB!PHP 脚本自然在完成之前超时。
我将我的函数更改为使用 `ftp_put`,去掉了检查 `FTP_MOREDATA` 的循环(如上面的示例所示),同一个脚本在没有其他更改的情况下,在 30 秒内上传了 2.2MB。
如果你使用此函数而不是 `ftp_put` *仅仅是为了加快脚本速度*,并且它花费了很长时间,你可能想尝试使用 `ftp_put`。
大家好,
`ftp_put` 在客户端服务器上无法正常工作,但在我的本地系统上可以正常工作。
客户端服务器上的问题
生产错误: `ftp_put(): I won't open a connection to 172.31.17.181 (only to 52.33.186.63).`
我的脚本从本地系统上传文件到远程服务器。
谢谢
Paras Chauhan