当前位置: 首页> 最新文章列表> ftp_pasv 如何与 ftp_connect 结合使用,教你一步步实现FTP连接和被动模式设置

ftp_pasv 如何与 ftp_connect 结合使用,教你一步步实现FTP连接和被动模式设置

M66 2025-06-28

在使用 PHP 进行 FTP 操作时,我们经常会遇到连接超时或数据无法传输的情况。特别是在一些防火墙或 NAT 网络环境中,主动模式(Active Mode)可能会导致 FTP 数据连接失败。这时,被动模式(Passive Mode)就是解决问题的关键。本文将一步步带你了解如何使用 ftp_connectftp_pasv 实现稳定的 FTP 连接与数据传输。

一、了解 FTP 主动与被动模式的区别

在主动模式下,客户端发起连接到服务器的控制端口(默认21),服务器再回连客户端的一个随机端口传输数据。这在某些网络环境下会被拦截。

在被动模式下,客户端不仅发起控制连接,还主动发起数据连接,这种方式更容易通过防火墙和 NAT。

因此,在 PHP 脚本中明确开启被动模式,是提高兼容性和传输成功率的重要一步。

二、使用 ftp_connect 建立连接

ftp_connect 是 PHP 的内建函数,用于连接 FTP 服务器。其语法如下:

<span><span><span class="hljs-title function_ invoke__">ftp_connect</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$hostname</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">21</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">90</span></span><span>): FTP\Connection|</span><span><span class="hljs-literal">false</span></span><span>
</span></span>

示例代码:

<span><span><span class="hljs-variable">$ftp_host</span></span><span> = </span><span><span class="hljs-string">'ftp.example.com'</span></span><span>;
</span><span><span class="hljs-variable">$ftp_port</span></span><span> = </span><span><span class="hljs-number">21</span></span><span>;

</span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_connect</span></span><span>(</span><span><span class="hljs-variable">$ftp_host</span></span><span>, </span><span><span class="hljs-variable">$ftp_port</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$conn</span></span><span>) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"无法连接到 FTP 服务器:<span class="hljs-subst">$ftp_host</span></span></span><span>");
}
</span></span>

三、使用 ftp_login 登录 FTP 用户

连接建立后,我们需要使用 ftp_login 来登录:

<span><span><span class="hljs-variable">$ftp_user</span></span><span> = </span><span><span class="hljs-string">'username'</span></span><span>;
</span><span><span class="hljs-variable">$ftp_pass</span></span><span> = </span><span><span class="hljs-string">'password'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">ftp_login</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>, </span><span><span class="hljs-variable">$ftp_user</span></span><span>, </span><span><span class="hljs-variable">$ftp_pass</span></span><span>)) {
    </span><span><span class="hljs-title function_ invoke__">ftp_close</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>);
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"FTP 登录失败!"</span></span><span>);
}
</span></span>

四、设置被动模式:ftp_pasv

连接成功并登录之后,必须在执行任何数据传输函数(如 ftp_get, ftp_put 等)之前调用 ftp_pasv 来启用被动模式:

<span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">ftp_pasv</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>)) {
    </span><span><span class="hljs-title function_ invoke__">ftp_close</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>);
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"无法开启被动模式!"</span></span><span>);
}
</span></span>

设置为 true 表示启用被动模式,false 表示使用主动模式。

五、完整示例代码

将以上步骤整合,得到如下完整示例:

<span><span><span class="hljs-meta">&lt;?php</span></span><span>

</span><span><span class="hljs-variable">$ftp_host</span></span><span> = </span><span><span class="hljs-string">'ftp.example.com'</span></span><span>;
</span><span><span class="hljs-variable">$ftp_port</span></span><span> = </span><span><span class="hljs-number">21</span></span><span>;
</span><span><span class="hljs-variable">$ftp_user</span></span><span> = </span><span><span class="hljs-string">'username'</span></span><span>;
</span><span><span class="hljs-variable">$ftp_pass</span></span><span> = </span><span><span class="hljs-string">'password'</span></span><span>;

</span><span><span class="hljs-comment">// 1. 建立连接</span></span><span>
</span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_connect</span></span><span>(</span><span><span class="hljs-variable">$ftp_host</span></span><span>, </span><span><span class="hljs-variable">$ftp_port</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$conn</span></span><span>) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"无法连接到 FTP 服务器!"</span></span><span>);
}

</span><span><span class="hljs-comment">// 2. 登录</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">ftp_login</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>, </span><span><span class="hljs-variable">$ftp_user</span></span><span>, </span><span><span class="hljs-variable">$ftp_pass</span></span><span>)) {
    </span><span><span class="hljs-title function_ invoke__">ftp_close</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>);
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"FTP 登录失败!"</span></span><span>);
}

</span><span><span class="hljs-comment">// 3. 启用被动模式</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">ftp_pasv</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>)) {
    </span><span><span class="hljs-title function_ invoke__">ftp_close</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>);
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"无法开启被动模式!"</span></span><span>);
}

</span><span><span class="hljs-comment">// 4. 示例:下载一个文件</span></span><span>
</span><span><span class="hljs-variable">$remote_file</span></span><span> = </span><span><span class="hljs-string">'remote/path/file.txt'</span></span><span>;
</span><span><span class="hljs-variable">$local_file</span></span><span> = </span><span><span class="hljs-string">'local_copy.txt'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">ftp_get</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>, </span><span><span class="hljs-variable">$local_file</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>, FTP_BINARY)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件下载成功!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件下载失败!"</span></span><span>;
}

</span><span><span class="hljs-comment">// 5. 关闭连接</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ftp_close</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>);
</span></span>

六、注意事项

  1. ftp_pasv 必须在 ftp_login 成功后调用。

  2. 某些 FTP 服务器默认不支持被动模式,需在服务器端配置。

  3. 遇到连接问题时,使用 ftp_raw 查看服务器响应,可帮助排查问题。

七、结语

通过结合使用 ftp_connectftp_loginftp_pasv,我们可以在复杂网络环境中稳定地使用 FTP 进行文件传输。在实际开发中,这一流程尤为重要,掌握这些函数的使用可以让你更自如地处理各种 FTP 操作问题。希望本文的讲解能帮你顺利实现 FTP 的连接与被动模式设置。