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

Explicit FTPS上传时ftp_put报连接失败及超时问题求助

问题分析与解决思路

核心矛盾是文件实际上传成功但PHP侧触发连接失败/超时,说明数据传输完成后,控制连接的会话维持/握手环节出现异常,而非数据传输本身的问题。结合你的环境配置,从以下几个方向排查修复:

1. 调整vsftpd的FTPS超时与会话配置

vsftpd默认控制连接超时过短,大文件上传完成后服务器可能主动关闭连接,导致PHP返回失败。修改/etc/vsftpd/vsftpd.conf:

# 延长控制连接超时(单位:秒,建议设为600)
idle_session_timeout=600
# 延长数据连接超时
data_connection_timeout=300
# 确保被动模式配置正确(显式FTPS依赖被动模式)
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=50000
pasv_address=你的虚拟机同网段IP
# 优化SSL会话兼容性
ssl_reuse_session=YES
require_ssl_reuse=NO

修改后重启vsftpd:

systemctl restart vsftpd

2. 优化PHP的FTP参数与超时设置

PHP原生FTP扩展默认超时配置不足以支撑大文件上传,在代码中添加:

// 初始化FTP连接后设置超时(单位:秒)
ftp_set_option($ftp_conn, FTP_TIMEOUT_SEC, 300);
// 强制开启被动模式(FTPS必须确保启用)
ftp_pasv($ftp_conn, true);
// 临时延长脚本执行时间,避免触发超时致命错误
set_time_limit(600);

3. 排查网络与防火墙配置

  • Windows主机防火墙需放行FTP(21端口)和被动模式端口范围(40000-50000)的入站/出站规则;
  • Rocky Linux虚拟机开放对应端口:
firewall-cmd --add-service=ftp --permanent
firewall-cmd --add-port=40000-50000/tcp --permanent
firewall-cmd --reload
  • 确认VMware桥接网卡配置正常,虚拟机IP可被Windows主机直接访问,无NAT端口映射冲突。

4. 改用CURL替代原生FTP扩展

PHP原生FTP扩展对FTPS的会话处理存在兼容性问题,改用CURL实现上传更稳定:

$local_file = $_FILES['upload']['tmp_name'];
$remote_file = '/path/to/remote/file.jpg';
$ftp_host = 'ftp://你的FTPS服务器IP';
$ftp_user = '你的FTP用户名';
$ftp_pass = '你的FTP密码';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $ftp_host . $remote_file);
curl_setopt($ch, CURLOPT_USERPWD, "$ftp_user:$ftp_pass");
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, fopen($local_file, 'r'));
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($local_file));
curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_ALL);
curl_setopt($ch, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_TLS);
curl_setopt($ch, CURLOPT_TIMEOUT, 300);
// 开启调试可查看详细会话日志
// curl_setopt($ch, CURLOPT_VERBOSE, true);

$response = curl_exec($ch);
if (!$response) {
    echo '上传错误: ' . curl_error($ch);
} else {
    echo '上传成功';
}
curl_close($ch);

5. 查看vsftpd日志定位具体问题

通过日志排查连接断开的根因:

tail -f /var/log/vsftpd.log

若日志显示SSL handshake failed或Connection closed by remote host,可进一步调整vsftpd的SSL加密套件配置,优先选择兼容性好的套件。


内容的提问来源于stack exchange,提问作者user16088441

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:27:18