Php ftp 使用缓存的 TLS 会话

问题描述 投票:0回答:1

我正在尝试将文件发送到 FTPS 服务器。

$conn_id = ftp_ssl_connect($ftp_server,$ftp_port);
$login_result = ftp_login( $conn_id, $ftp_user, $ftp_pass );
ftp_set_option($conn_id, FTP_USEPASVADDRESS, false);
ftp_pasv($conn_id, true);
ftp_put( $conn_id, $dest_file, $source_file, FTP_BINARY );
ftp_close($conn_id);

这给了我这个错误

Warning: ftp_put(): Data connection must use cached TLS session

或者有时,当我更改要上传的文件时,它会给我这些错误:

Warning: ftp_put(): SSL write failed
Warning: ftp_put(): SSL_shutdown failed
Warning: ftp_put(): File status okay; about to open data connection.

我在 python 修复中发现了类似的问题 使用 Python ftplib 的 FTPS - 需要会话重用

服务器似乎希望数据连接使用与命令端口相同的 TLS 设置/会话。我无法控制要上传到的服务器。我已经使用

lftp
测试了服务器并确保它可以正常工作。

是否可以使用 php 内置的 ftp 库来修复此问题,或者我应该找到另一个 ftp 库(例如 Curl)?

php ftp
1个回答
0
投票

正如 @sammitch 在评论中提到的,这是一个已知的错误,直到 php 版本 8.2.14 和 8.3.1

由于升级我们正在使用的 php 版本是一项长期任务,我现在选择使用 php 的内置 cURL 绑定。

$fhandle = fopen($source_file,"r");

$url = "ftp://$ftp_server/$dest_file";
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_USERNAME,$ftp_user);
curl_setopt($ch,CURLOPT_PASSWORD,$ftp_pass);
curl_setopt($ch,CURLOPT_PORT,$ftp_port);

curl_setopt($ch,CURLOPT_PROTOCOLS,CURLPROTO_FTP);
curl_setopt($ch,CURLOPT_FTP_SSL,CURLFTPSSL_TRY);

curl_setopt($ch,CURLOPT_UPLOAD,true);
curl_setopt($ch,CURLOPT_INFILE,$fhandle);
curl_setopt($ch,CURLOPT_INFILESIZE,fileSize($source_file));

$result = curl_exec($ch);
curl_close($ch);
fclose($fhandle);
© www.soinside.com 2019 - 2024. All rights reserved.