ftp_rawlist始终在被动模式下的FTPES服务器上失败

时间:2018-09-14 14:39:59

标签: php ftp

我必须连接到FTPES服务器才能检索数据。连接和登录都可以,但我对ftp_rawlist的呼叫始终失败并返回“ false”。

我将以下代码用于调试目的:

$ftp = ftp_ssl_connect($ftp_host);
if (ftp_login($ftp, $ftp_user, $ftp_pass)) {
    $p = ftp_pasv($ftp, true);
    var_dump($p);

    $r = ftp_rawlist($ftp, '/', true);
    var_dump($r);
} else {
    echo 'Could not login';
}

$p始终为true,$r始终为false。

当我通过Filezilla连接到服务器时,一切正常,并且我可以列出目录内容等等。

更新#1:试图不仅列出'/',而且列出服务器上的各个子文件夹,它们都无法通过脚本执行。

更新#2:还尝试将ftp_raw与命令一起使用以获取列表,但是LIST命令运行一段时间,然后根本不返回任何结果。但是HELP将LIST列为服务器的有效命令...奇怪...

更新#3:我现在尝试了phpseclib,但是虽然可以连接,但无法使用用户名/密码组合登录。 FTPES服务器维护者的支持没有发生(“对于其他人来说工作正常……”),所以我需要找出另一种方式...:-)

2 个答案:

答案 0 :(得分:0)

要结束此问题:随着该项目的最后期限越来越近,必须找到解决方案。尽管从某种意义上说这不是真正的答案,但我还是想展示一下如何解决此问题。也许有人通过谷歌搜索偶然发现了这一点。

除了OP中提到的内容,我还尝试了connecting to FTPS using PHP and certificate as auth,该方法也不起作用。由于没有按预期的方式工作,我想知道FTPS服务器是否真的配置正确。

运行服务器的人告诉我,一切都很好,他们的CLI CURL调用对他们​​也很好,因此他们无需进一步调查问题。

因此,我在启用了shell_exec()的服务器上设置了一个沙箱帐户。现在正在运行一个脚本,该脚本通过CURL获取文件列表,然后使用服务器提供商提供的命令通过CURL下载文件。该服务器可以通过普通的SFTP访问,因此可以充当“代理FTP”,定期镜像远程FTPS服务器文件结构。

尽管我发现此“解决方案”相当“ hacky”,但目前看来它运行可靠,稳定且快速。因此,我们将能够在今年(仅在圣诞节前三个月左右)以这种方式运行该业务,并在新的一年中对其进行研究,并开发出更稳定的解决方案。

也许服务器人员的压力也减轻了,他们愿意帮助...;-)

答案 1 :(得分:0)

将以下调用添加到ftp_set_option()的行之前的行ftp_pasv

ftp_set_option($ftp, FTP_USEPASVADDRESS, false);
ftp_pasv($ftp, true);