标签 ftp_pasv 下的文章

ftp_connect方法无法连接FTP服务器的解决办法


最近做了个关于PHP连接FTP服务器的小功能,发现一些FTP服务器用客户端可以连接但是PHP程序却无法连接。再排出网络问题外,最后得出结论如下:

首先介绍一下连接FTP服务器的两种工作模式:

主动模式的ftp是这样的;客户端从一个任意的非特权端口连接到ftp服务器的命令端口(21),然后客户端开始监听端口,并发送ftp命令到ftp服务器。服务器从它自己的数据端口20连接到客户端指定的数据端口。
被动模式ftp中,命令连接和数据连接都由客户端,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口,并发送PORT P命令给客户端。然后客户端发起从本地端口到服务器的端口的连接用来传送数据。

这些ftp服务器并非直接建立在公网,而是建设在内网通过端口映射的方式可使公网访问。也就是说必须采用主动模式访问,因为服务端仅有21端口映射到了公网。而php_connect默认为被动模式,所以调用ftp_pasv方法即可,具体如下:

$conn = ftp_connect("ftp.testftp.com") or die("Could not connect");
ftp_login($conn,"admin","ert456");
ftp_pasv($conn,FALSE);
ftp_close($conn);