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

PHP中FTPS上传报错:数据连接需复用TLS会话如何解决?

问题解决:PHP FTPS上传会话复用错误

结论

PHP内置FTP扩展不支持TLS会话复用,无法满足服务器要求的「数据连接复用控制连接TLS会话」规则,必须改用cURL这类支持该特性的库来解决问题。

问题原因

你遇到的报错是因为服务器启用了严格的FTPS安全配置,要求数据连接必须复用控制连接的TLS会话(防止会话劫持风险),但PHP的ftp_ssl_connect系列函数底层未实现会话复用逻辑,因此触发验证失败。

cURL解决方案代码

以下是使用cURL实现FTPS上传的示例代码,它默认支持TLS会话复用,可适配服务器的要求:

$ftp_server = '你的FTPS服务器地址';
$ftp_port = 990; // 通常FTPS默认端口为990,可根据实际情况调整
$ftp_user = '你的用户名';
$ftp_pass = '你的密码';
$source_file = '本地待上传文件路径';
$dest_file = '服务器目标文件路径';

$ch = curl_init();

// 设置FTPS目标地址
curl_setopt($ch, CURLOPT_URL, "ftps://{$ftp_server}:{$ftp_port}/{$dest_file}");
// 配置登录凭证
curl_setopt($ch, CURLOPT_USERPWD, "{$ftp_user}:{$ftp_pass}");
// 开启上传模式
curl_setopt($ch, CURLOPT_UPLOAD, true);
// 读取本地文件资源
$file_handle = fopen($source_file, 'rb');
curl_setopt($ch, CURLOPT_INFILE, $file_handle);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($source_file));

// 配置FTPS安全选项,启用会话复用
curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_ALL);
curl_setopt($ch, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_TLS);
curl_setopt($ch, CURLOPT_SSL_SESSIONID_CACHE, true);

// 关闭EPSV模式,与你之前设置的FTP_USEPASVADDRESS逻辑对应
curl_setopt($ch, CURLOPT_FTP_USE_EPSV, false);

// 执行上传操作
$upload_result = curl_exec($ch);

if (!$upload_result) {
    echo "上传失败:" . curl_error($ch);
} else {
    echo "上传成功";
}

// 清理资源
fclose($file_handle);
curl_close($ch);

补充说明

  • 你用lftp能正常工作,是因为lftp默认支持TLS会话复用,符合服务器的安全配置要求。
  • PHP内置FTP扩展目前没有任何配置项可以开启TLS会话复用,无论调整什么参数都无法绕过这个限制,只能更换工具库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:22:21