php_connect_nonb()失败:操作正在进行中(115)"间歇性地发生


"php_connect_nonb() failed: Operation now in progress (115)" happens intermittently

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

然而,有时我们会得到以下错误:

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

当我说"有时"的时候,我就是这个意思;大多数情况下都没问题,但大约五分之一的情况下会出现错误。这与文件本身无关,因为如果我们再试一次,它们就会愉快地消失。

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

那么,为什么这在某些时候会起作用而在其他时候不起作用呢?

ftp_set_option($ftpconn, FTP_USEPASVADDRESS, false);

设置连接的无源性ftp_pasv($ftpconn, true);

之前的这行代码

解决了我的问题

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

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

简单的方法是允许FTP服务器和客户端不受限制通过您的防火墙访问,但如果您想限制他们的访问"已知"端口,您必须了解4种不同的场景。

1)允许FTP服务器接受对端口的TCP连接从端口20到任意(远程临时)建立TCP连接。港口。

2)允许FTP服务器接受到端口的TCP连接和接受TCP连接到任何短暂的端口以及!

3)允许FTP客户端对端口进行TCP连接

从端口20到任意临时端口的TCP连接。

4)允许FTP客户端对端口进行TCP连接21,并使TCP连接到任何其他(远程临时)端口!

所以,我在我的FTP服务器上做了一些调查,并阅读了你提供给elitehosts.com的链接后写下了这个答案。

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

在我设置这个之后,它工作了!不太确定你的FTP服务器是否NAT,但我想我会在这个帖子上提供答案,因为它似乎是相关的。

除了Cees的回答,我在ec2上运行vsftp,必须注释掉listen_ipv6=YES, listen=YES然后"service vsftpd restart"。

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

对我来说,我所要做的就是删除ftp_pasv( $ftpconn, true );,一切都工作得很好。我还不知道为什么,但我正在努力找出原因,当我找到背后的原因时,我一定会回来的。

这应该是在jj_dev2评论下的评论,但由于声誉,我不能添加一个。但也许它会对某些人有帮助,所以我把它贴在这里。

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

jj_dev2注释中的解决方案确实对我们有效。所以我们研究了ftp_set_option($conn, FTP_USEPASVADDRESS, false)到底是做什么的。在此基础上,我们发现实际上客户的FTPS服务器配置错误。

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

相关文章: