17

我们通过 FTP 使用 PHP cron 作业将一些文件发送给第三方。

但是有时我们会收到以下错误:

ErrorException [ 2 ]: ftp_put(): php_connect_nonb() failed: Operation 
now in progress (115) ~ MODPATH/fileop/classes/Drivers/Fileop/Ftp.php [ 37 ]

当我说“有时”时,我的意思正是如此;大多数时候它都很好,但大约五分之一的时候我们会得到这个错误。这与文件本身无关,因为如果我们再试一次,它们会很开心。

我们在网上发现了类似的问题——与带有 NAT 设备的 PHP 中的错误或与防火墙配置有关,但再次暗示,如果是这种情况,它将永远无法工作。

那么,为什么这有时会起作用,而其他时候却不起作用?

4

6 回答 6

15
ftp_set_option($ftpconn, FTP_USEPASVADDRESS, false);

这行代码在设置连接的被动之前ftp_pasv($ftpconn, true);

解决了我的问题

于 2019-12-24T11:59:33.687 回答
11

FTP(S) 使用随机端口建立数据连接;间歇性成功率表明客户端和/或服务器计算机上的防火墙并非允许所有端口。传入 (PASV) 数据连接的端口范围可以在 FTP 服务器中设置。

这个页面有一个很好的总结:

简单的方法是简单地允许 FTP 服务器和客户端无限制地通过防火墙进行访问,但是如果您想限制他们对“已知”端口的访问,您必须了解 4 种不同的情况。

1) 应该允许 FTP 服务器接受到端口 21 的 TCP 连接,并允许从端口 20 到任何(远程临时)端口的 TCP 连接。

2) 应该允许 FTP 服务器接受到端口 21 的 TCP 连接,并且也接受到任何临时端口的 TCP 连接!

3) 应该允许 FTP 客户端与端口 21 建立 TCP 连接,并接受从端口 20 到任何临时端口的 TCP 连接。

4) 应该允许 FTP 客户端与端口 21 建立 TCP 连接,以及与任何其他(远程临时)端口建立 TCP 连接!

于 2017-04-18T10:06:48.167 回答
2

因此,在对我的 FTP 服务器进行一些调查并阅读您提供的elitehosts.com 链接之后,我正在写这个答案。

我正在使用 FileZilla FTP 服务器,我必须输入一个特定设置才能使其工作。进入服务器设置,有一个名为“被动模式设置”的区域。在该对话框中,有一个名为“IPv4 特定”的区域,在该区域内有一个标记为“被动模式传输的外部服务器 IP 地址:”的设置。这是一个单选按钮选择集,它位于“默认”上,但由于 FTP 服务器是 NAT 的,我将单选选项从“默认”更改为“使用以下 IP:”并输入面向外部的 IP我的 ISP 提供的网关地址。

在我设置之后,它起作用了!不太确定您的 FTP 服务器是否经过 NAT,但我想我会在此线程上提供答案,因为它似乎相关。

于 2013-06-11T15:49:57.120 回答
1

除了 Cees 的回答之外,我还在 ec2 上运行 vsftp 并且不得不注释掉 listen_ipv6=YES,listen=YES 然后“service vsftpd restart”。

虽然文档说它也会监听 ipv4,但它不是,这解决了这个问题。

于 2018-08-15T15:16:01.523 回答
0

对我来说,我所要做的就是删除ftp_pasv( $ftpconn, true );并且一切正常。我还不确定为什么,但我正在努力找出答案,当我找到背后的原因时,我一定会回来的。

于 2021-04-30T22:33:00.043 回答
0

这应该是 jj_dev2 评论下的评论,但由于声誉问题,我无法添加。但也许它会对某人有所帮助,所以我把它贴在这里。

我们遇到了与原始帖子中描述的相同的问题。在我们的案例中,它与许多客户合作——除了一个。

jj_dev2 评论中的解决方案确实对我们有用。所以我们调查了ftp_set_option($conn, FTP_USEPASVADDRESS, false)实际做了什么。并据此我们发现实际上客户的 FTPS 服务器配置错误。

作为对 PASV 命令 ( ftp_pasv($conn, true)) 的响应,FTP 服务器返回一个 IP 地址,PHP FTP 客户端随后将使用该地址进行数据传输。在我们的例子中,FTP 服务器返回的是一个内部 IP 地址,而不是我们连接的公共 IP 地址。客户必须修复他们的 FTP 服务器设置,以便 FTP 服务器在 PASV 命令响应中发送外部 IP 地址。

于 2021-10-13T11:56:06.673 回答