如果您收到类似以下的错误
警告:ftp_nb_put():无法在 /path/to/file.php 的第 27 行中为 PORT 命令提供服务
验证您是否需要处于 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);
}
?>
如果您收到类似以下的错误
警告:ftp_nb_put():无法在 /path/to/file.php 的第 27 行中为 PORT 命令提供服务
验证您是否需要处于 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。