PHP用ftp_ssl_connect连接FTP时传输失败挂起,ftp_connect正常,求原因
问题解决:ftp_ssl_connect登录后操作触发504超时
核心问题
使用ftp_ssl_connect连接要求SSL的FTP服务器时,仅登录逻辑可正常执行,但添加登录后的任何操作(如获取文件列表、读取文件修改时间、下载/删除文件)会导致脚本挂起,最终返回504错误。
解决方案
这类问题大多是FTP被动模式未启用导致的,FTP over SSL环境下,服务器通常要求客户端使用被动模式进行数据传输,否则会因为防火墙/NAT拦截数据连接而超时。以下是具体修复步骤:
- 强制启用被动模式
登录成功后立即调用ftp_pasv()开启被动模式,这是最关键的修复:
// 登录成功后添加这行代码 ftp_pasv($ftp, true);
- 调整FTP超时时间(可选)
如果服务器响应较慢,可通过ftp_set_option()延长超时时间,避免因超时触发504:
// 设置超时时间为30秒(可根据实际情况调整) ftp_set_option($ftp, FTP_TIMEOUT_SEC, 30);
- 证书验证问题排查(测试用)
若服务器SSL证书存在不规范情况,可能导致后续连接中断,可临时禁用证书验证排查(生产环境不建议长期使用):
// 禁用主机和证书验证(仅用于测试排查) ftp_set_option($ftp, FTP_SSL_VERIFY_HOST, false); ftp_set_option($ftp, FTP_SSL_VERIFY_PEER, false);
修改后的完整代码
<?php // 建立SSL连接 $ftp = ftp_ssl_connect('myremotesite.com'); // 设置超时时间 ftp_set_option($ftp, FTP_TIMEOUT_SEC, 30); // 临时禁用证书验证(可选,测试用) ftp_set_option($ftp, FTP_SSL_VERIFY_HOST, false); ftp_set_option($ftp, FTP_SSL_VERIFY_PEER, false); // 使用用户名和密码登录 $login_result = ftp_login($ftp, 'username', 'password'); if (!$login_result) { die("无法登录"); } // 启用被动模式(关键修复) ftp_pasv($ftp, true); // 获取指定路径下的文件列表 $files = ftp_nlist($ftp, '/1668161919_DATA/*add.zip') or die("未找到文件"); $mostRecent = array( 'time' => 0, 'file' => null ); foreach ($files as $file) { // 获取文件的最后修改时间 $time = ftp_mdtm($ftp, $file); if ($time > $mostRecent['time']) { $mostRecent['time'] = $time; $mostRecent['file'] = $file; } } ftp_get($ftp, "/home/mysite/public_html/wp-content/uploads/data-zipped/target.zip", $mostRecent['file'], FTP_BINARY); ftp_delete($ftp, $mostRecent['file']); ftp_close($ftp); ?>
额外说明
- 被动模式启用后,客户端会从服务器获取一个随机端口用于数据传输,需确保服务器防火墙开放了对应端口范围(通常是1024-65535)。
- 生产环境建议恢复证书验证,并确保服务器SSL证书有效且被客户端信任。
内容的提问来源于stack exchange,提问作者PaulW32
相关产品推荐
相关产品推荐

