先说问题:最近有个需求,上传一些文件到ftp服务器,代码在linux服务器上运行ok,档案正常上传到了ftp服务器。代码如下:
$ftp_server = ""; $port = 21; $username = ""; $password = ""; $filename = "aa.csv"; $remote_file = "aa.csv"; $ftp = ftp_connect($ftp_server, $port); $login_result = ftp_login($ftp, $username, $password); $res = ftp_put($ftp, $remote_file, $filename, FTP_ASCII); ftp_close($ftp);
然而放到windows系统的IIS服务器后,发现了10个档案只随机上传成功了1-5个,而且1k左右的文件也传输了好久。有经验的同事加了一行代码,代码在IIS上成功运行,文件全部快速的传到了ftp服务器上。
$ftp_server = ""; $port = 21; $username = ""; $password = ""; $filename = "aa.csv"; $remote_file = "aa.csv"; $ftp = ftp_connect($ftp_server, $port); $login_result = ftp_login($ftp, $username, $password); ftp_pasv($ftp, true); //windows防火墙,打开被动模式 $res = ftp_put($ftp, $remote_file, $filename, FTP_ASCII); ftp_close($ftp);
上面的代码在linux 上运行,又出现了10各档案只随机上传成功了1-5个的情况。
这里补一下FTP主动模式的被动模式的知识:
主动模式:
FTP客户端使用N(N>1023)端口连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端开放N+1端口,发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据.
被动模式:
FTP客户端使用N(N>1023)连接FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再通过N+1端口连接到服务器开放的端口进行数据传输
区别对比
二者的区别主要在于建立数据传输连接的时候,主模式的连接发起方为服务器端,使用20号端口连接客户端的N+1端口建立数据连接;被动模式连接发起方为客户端,客户端使用端口号+1去连接服务器的某一高位端口;
网络设置区别
主动模式下,客户端的FTP软件设置主动模式开放的端口段,在客户端的防火墙开放对应的端口段即可。