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
相关产品推荐
相关产品推荐

