You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP用ftp_ssl_connect连接FTP时传输失败挂起,ftp_connect正常,求原因

问题解决:ftp_ssl_connect登录后操作触发504超时

核心问题

使用ftp_ssl_connect连接要求SSL的FTP服务器时,仅登录逻辑可正常执行,但添加登录后的任何操作(如获取文件列表、读取文件修改时间、下载/删除文件)会导致脚本挂起,最终返回504错误。

解决方案

这类问题大多是FTP被动模式未启用导致的,FTP over SSL环境下,服务器通常要求客户端使用被动模式进行数据传输,否则会因为防火墙/NAT拦截数据连接而超时。以下是具体修复步骤:

  1. 强制启用被动模式
    登录成功后立即调用ftp_pasv()开启被动模式,这是最关键的修复:
// 登录成功后添加这行代码
ftp_pasv($ftp, true);
  1. 调整FTP超时时间(可选)
    如果服务器响应较慢,可通过ftp_set_option()延长超时时间,避免因超时触发504:
// 设置超时时间为30秒(可根据实际情况调整)
ftp_set_option($ftp, FTP_TIMEOUT_SEC, 30);
  1. 证书验证问题排查(测试用)
    若服务器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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:50:33