PHP FTP 'vsf_sysutil_recv_peek no data' 错误的解决办法
代码如下:
1 | $ftp = ftp_connect($config['host'], $config['port'], 10); |
始终上传不上去,$result为false。但是用FileZilla却能正常上传。
用tcpdump抓包看返回:500 OOPS: vsf_sysutil_recv_peek: no data
如图:
这是因为被动模式下,FTP SERVER返回了个私有地址(172那个),然后FTP CLIENT无法识别。
解决办法有两个:
- 在ftp_pasv前面加上ftp_set_option($ftp, FTP_USEPASVADDRESS, false);
但是5.6.10版本不支持,需要升级到5.6.30+(没仔细看哪个版本提交的bugfix)
2.如果FTP server是vsftpd, 可在server端设置
1
2pasv_addr_resolve=YES 被动模式是否用设置好的的地址返回给客户端,如果是NO,则从链接的套接字中自己获取地址,如果为YES,则设置为下面这个地址
pasv_address=202.101.104.126 被动模式下返回的地址,安全需要,隐掉后面两个地址段
参考链接:
- https://winscp.net/eng/docs/ftp_modes
- https://stackoverflow.com/questions/38982901/php-ftp-passive-ftp-server-behind-nat
- https://github.com/php/php-src/pull/1668