记一次PHP使用FTP上传出现的错误:ftp_put(): php_connect_nonb() failed: Operation now in progress (115)的解决方法

PHP使用FTP上传出现:php_connect_nonb警告导致上传失败问题

先说说问题怎么出现的

机器一共两台,一台Windows2008服务器,一台CentOS7。FTP服务器安装在Windows服务器上,使用的是FileZilla Server,推荐使用这个,安装方便,配置也灵活,最好不要用Windows自带的FTP服务器,很难用,各种问题。接着说,CentOS上部署的是PHP网站,最初是使用主动模式来上传的,FTP是某某云服务器,有安全组,配置端口很方便,主动模式也只要放开20,21两个端口就好了,而PHP服务器当初是没有任何防火墙的,空白的,所以直接使用的主动模式来搞。

后来业务好了些,访问量上来了,就不停的有各种攻击来了,只好赶紧把PHP服务器上防火墙开启起来,但是有了防火墙,FTP上传的问题就来了,首先主动模式肯定不行了,因为你不可能放开各种端口,这里补充一下FTP主动和被动模式的知识:

主动模式:就是在客户端FTP登录成功后,FTP服务器主动连客户端的传输端口传输数据,至于端口是多少,是客户端随机取的一个(只要大于1024的端口就可以),所以呢FTP服务器端只需维护20,21两个端口,但是客户端却要放开1024以上的所有端口,不然无法建立数据传输通道。

被动模式:就是客户端去连服务端的传输端口了,就是服务器端是被动的,服务器端随机开发好大于1024的端口号就可以了,而这个是可以在服务器端配置的,只需要给一段端口就行了,这样客户端就不用去开发那么多端口了,这种对有防火墙的客户端就很方便了。

继续,FTP服务器设置并开放了端口了,客户端PHP里也设置了开启被动模式:

ftp_pasv($conn, true); //ftp设置被动模式

但是,但是,但是
一上线测试,问题就来了,出现两个警告:

Warning: ftp_put(): php_connect_nonb() failed: Operation now in progress (115) in ...
Warning: ftp_put(): Type set to I in ...

一看以为警告,没什么影响,但是,但是,但是,居然上传失败了,FTP服务器也没什么提示,直接Goodbye了,-_-…

解决方案的崎岖之路

然后就是一通网上找,找了N就都是各种无关的复制粘贴的文章(心哇凉哇凉滴),太坑了,然后试着去stackoverflow搜了一下(英语渣,硬着头皮找),居然不少人遇到这个问题了,具体找了看到一篇有解决方案的:
https://stackoverflow.com/questions/38982901/php-ftp-passive-ftp-server-behind-nat
里面那仅有的一个回答,说出了真相:

ftp_set_option($conn, FTP_USEPASVADDRESS, false); //加上一个option操作就行了
ftp_pasv($conn, true);

立马加上,一测试,完美解决!
另外还有一篇文章专门说了这个问题,
http://www.elitehosts.com/blog/php-ftp-passive-ftp-server-behind-nat-nightmare/
但是是原来老版本PHP的配置,感兴趣的(英语好的)可以细读读。
去PHP官网查看一下这个配置,习惯性选择Chinese,然后发现居然没有这个FTP_USEPASVADDRESS参数,我!!!反手切换为English,果然,果然,果然,翻译都不靠谱,英文文档上很清晰的说明了这个参数的意思,就是忽略FTP服务器返回的IP地址而直接使用ftp_connect里面写的IP地址,大概来说就是FTP服务器是各种虚拟的网络,而FTP服务器连接上之后可能返回给你不是真实的服务器IP(暂且这么理解吧~~~~)

总结

最后,说明一点:英语真TM的好用!另外,看PHP官方文档千万别看翻译的,因为可能很古老了~~~

对了,还有个另外:用Java写的来传就可以直接成功,PHP还得设置这个参数!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值