PHP put/get/list 命令超时
PHP timeout on put/get/list commands
我整天都在处理这个问题。 A couple hours ago I wrote this Question。我有一个 PHP 脚本,在我的开发 PC 上工作正常,但在真实服务器上不太好。
脚本是:
$conn_id = ftp_ssl_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
//$DB = @mysqli_connect($hostname_DB,$username_DB,$password_DB,$database_DB);
if ($login_result == null)
die("Cannot connect");
echo "Connected<br />Changing to passive mode <br />";
if (ftp_pasv($conn_id, true))
{
echo "Passive mode: ON<br /><br />";
}
else
{
echo "Passive mode: OFF<br /><br />";
}
echo "Current dir: " . ftp_pwd($conn_id) . "\n";
if (ftp_chdir($conn_id, "ABC")) {
echo "Current dir is now: " . ftp_pwd($conn_id) . "\n";
} else {
echo "Dir was not changed\n";
}
$files = array();
$files = ftp_rawlist($conn_id, '.');
echo "<br />Files<br />";
print_r($files);
ftp_close($conn_id);
在这一行:$files = ftp_rawlist($conn_id, '.'); (line 65)
脚本冻结了大约一分钟并给出了这个错误:
Connected
Changing to passive mode
Passive mode: ON
Current dir: / Current dir is now: /ABC
Warning: ftp_rawlist(): php_connect_nonb() failed: Operation now in progress (115) in /var/www/html/ftpscript.php on line 65
Files
不更改为被动模式是没有警告的相同输出。也没有回显文件(低于 'Files')。 nlist、mput、mget 等任何命令都会发生同样的情况。
我读过 this article 但不知道它是否仍然适用。其他网站说是我的防火墙配置,但我不知道该怎么做。我的服务器是 运行:
PHP 5.4.16 (cli) (built: Oct 31 2014 12:59:36)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
我打开了端口 20、21,范围从 5000 到 5100。有了所有这些,我不知道这是否是我的问题,但 PHP。如果我使用 lftp(cli ftp 客户端)它工作正常。
编辑#1
这似乎是 php 中 ftp 实现中的一个错误。但是我不知道如何应用此处列出的补丁 https://bugs.php.net/patch-display.php?bug_id=55651&patch=ftp_usepasvaddress.patch&revision=latest
拜托,我们将不胜感激。谢谢!
好吧,我结束了向 download/upload 编写函数并使用带有 PHP 的 curl 列出。 AFAIK 这是一个 PHP 使用内置 ftp 实现时的错误。 Curl 有点慢,但可以满足我的需要。
我整天都在处理这个问题。 A couple hours ago I wrote this Question。我有一个 PHP 脚本,在我的开发 PC 上工作正常,但在真实服务器上不太好。
脚本是:
$conn_id = ftp_ssl_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
//$DB = @mysqli_connect($hostname_DB,$username_DB,$password_DB,$database_DB);
if ($login_result == null)
die("Cannot connect");
echo "Connected<br />Changing to passive mode <br />";
if (ftp_pasv($conn_id, true))
{
echo "Passive mode: ON<br /><br />";
}
else
{
echo "Passive mode: OFF<br /><br />";
}
echo "Current dir: " . ftp_pwd($conn_id) . "\n";
if (ftp_chdir($conn_id, "ABC")) {
echo "Current dir is now: " . ftp_pwd($conn_id) . "\n";
} else {
echo "Dir was not changed\n";
}
$files = array();
$files = ftp_rawlist($conn_id, '.');
echo "<br />Files<br />";
print_r($files);
ftp_close($conn_id);
在这一行:$files = ftp_rawlist($conn_id, '.'); (line 65)
脚本冻结了大约一分钟并给出了这个错误:
Connected
Changing to passive mode
Passive mode: ON
Current dir: / Current dir is now: /ABC
Warning: ftp_rawlist(): php_connect_nonb() failed: Operation now in progress (115) in /var/www/html/ftpscript.php on line 65
Files
不更改为被动模式是没有警告的相同输出。也没有回显文件(低于 'Files')。 nlist、mput、mget 等任何命令都会发生同样的情况。
我读过 this article 但不知道它是否仍然适用。其他网站说是我的防火墙配置,但我不知道该怎么做。我的服务器是 运行:
PHP 5.4.16 (cli) (built: Oct 31 2014 12:59:36)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
我打开了端口 20、21,范围从 5000 到 5100。有了所有这些,我不知道这是否是我的问题,但 PHP。如果我使用 lftp(cli ftp 客户端)它工作正常。
编辑#1
这似乎是 php 中 ftp 实现中的一个错误。但是我不知道如何应用此处列出的补丁 https://bugs.php.net/patch-display.php?bug_id=55651&patch=ftp_usepasvaddress.patch&revision=latest
拜托,我们将不胜感激。谢谢!
好吧,我结束了向 download/upload 编写函数并使用带有 PHP 的 curl 列出。 AFAIK 这是一个 PHP 使用内置 ftp 实现时的错误。 Curl 有点慢,但可以满足我的需要。