我们通过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设备的bug in PHP相关或与防火墙配置有关但又暗示如果是这种情况则从不工作
那么,为什么这种情况会有效而不是其他情况呢?
答案 0 :(得分:5)
FTP(S) uses random ports to set up data connections;间歇性成功率表示客户端和/或服务器计算机上的防火墙不允许所有端口。可以在FTP服务器中设置传入(PASV)数据连接的端口范围。
This page有一个很好的总结:
简单的方法是简单地允许FTP服务器和客户端无限制 通过防火墙访问,但如果您想限制他们的访问权限 “已知”端口,您必须了解4种不同的场景。
1)应允许FTP服务器接受到端口的TCP连接 21,并建立从端口20到任何(远程短暂)的TCP连接 端口。
2)应允许FTP服务器接受到端口的TCP连接 21,AND也接受到任何短暂端口的TCP连接!
3)应允许FTP客户端与端口建立TCP连接 21,并接受从端口20到任何短暂端口的TCP连接。
4)应允许FTP客户端与端口建立TCP连接 21,并与任何其他(远程短暂)端口建立TCP连接 还有!
答案 1 :(得分:1)
所以,我在对我的FTP服务器进行一些调查并阅读你提供的链接elitehosts.com之后,我正在写这个答案。
我正在使用FileZilla FTP服务器,并且我必须输入一个特定设置才能使其正常工作。进入服务器设置,有一个标题为“被动模式设置”的区域。在该对话框中,有一个标题为“IPv4特定”的区域,在该区域内有一个标记为“被动模式传输的外部服务器IP地址:”的设置。这是一个单选按钮选择集,它是“默认”,但由于FTP服务器是NAT,我将该无线电选择从“默认”更改为“使用以下IP:”并输入到面向外部的IP我的ISP提供的网关地址。
在我设置之后,它工作了!不是非常确定你的FTP服务器是否是NAT,但我想我会在这个帖子上提供答案,因为它看似相关。
答案 2 :(得分:0)
除了Cees的答案,我还在ec2上运行vsftp,并且不得不注释掉listen_ipv6 = YES,listen = YES然后“服务vsftpd重新启动”。
尽管文档说它也会监听ipv4,但这已经解决了问题。
答案 3 :(得分:0)
ftp_set_option($ftpconn, FTP_USEPASVADDRESS, false);
此代码行在设置连接ftp_pasv($ftpconn, true);
的无源性之前
解决了我的问题
答案 4 :(得分:0)
对我来说,我所要做的就是删除 ftp_pasv( $ftpconn, true );
并且一切正常。我还不确定为什么,但我正在努力找出原因,当我找到背后的原因时,我肯定会回来。