我正在尝试将文件发送到 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)?
正如 @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);