PHP ftp_nlist() - 超时

时间:2014-02-20 02:09:04

标签: php ftp

我有一个奇怪的问题:我可以连接到ftp服务器,创建目录但我无法获取目录中的文件列表。

可能出现什么问题?

事实:

  • 服务器位于防火墙后面
  • 是的,我使用被动模式,正如您从代码中看到的那样
  • PHP脚本位于FTP服务器所在的同一服务器上
  • 我可以使用FTP客户端从桌面访问FTP,一切正常,我可以创建/上传和读取目录内容。
  • ftp_pwd()ftp_mkdir()工作得很快,ftp_nlist()ftp_rawlist()等待ftp_connect()中指定的超时时间(例如10秒)
  • 在活动模式下 - 几乎相同的结果(red-dir-functions立即失败)

我认为问题不在脚本中,而是在ftp / server / firewall / access rights setup中。

有我的代码示例:

$conn = ftp_connect('my.host.here', 21, 10);

if (!$conn) {
    throw new Exception('Unable to connect to FTP');
}

$login_result = ftp_login($conn, 'login', 'password');
if (!$login_result) {
    throw new Exception('Unable to login to FTP');
}

// This is important part, because my server is behind frirewall/nat.
$paswRes = ftp_pasv($conn, true);
if (!$paswRes) {
    throw new Exception('Failed to enable passive FTP mode');
}

$resPwd = ftp_pwd($conn); //Returns: "/"

$resMkdir = ftp_mkdir($conn , 'testDir'); //Returns: "/testDir", creates new dir

$resNlist = ftp_nlist($conn, '.'); //Returns: bool(false)

$resRawlist = ftp_rawlist($conn, '.'); //Returns: bool(false)

更新:

如果主机为localhost,则有效。因此看起来问题在于防火墙/ ftp服务器设置。 我在ProFtpd

上使用Amazon EC2

指定为PassivePorts 49152 65534

的被动端口

此范围已添加为Amazon EC2安全组49152 - 65534 0.0.0.0/0

中的入站端口范围

1 个答案:

答案 0 :(得分:0)

好的,我已经解决了这个问题。 这是FTP服务器配置错误(在我的情况下 - ProFTPD服务器): 除PassivePorts外,我必须指定MasqueradeAddress

MasqueradeAddress                <your-Ftp-Server-Domain-Name-Or-Ip-Address>

更新另外,请查看以下文章:http://www.elitehosts.com/blog/php-ftp-passive-ftp-server-behind-nat-nightmare/