如何获取phpseclib SFTP操作的日志及服务器错误响应?
问题描述
使用以下PHP代码通过phpseclib3向SFTP服务器传输文件:
use phpseclib3\Net\SFTP; $sftp = new SFTP('localhost'); $sftp->login('user', 'password'); error_log($sftp->pwd()); foreach ($fileList as $key => $value) { $output = $sftp->put("//data//myfile.txt, //sourceFile.txt, SFTP::SOURCE_LOCAL_FILE); error_log($output); } error_log($sftp->getLastError()); // error_log($sftp->getSFTPLastError()); error_log('------------------------------------'); error_log("<pre>" . print_r($sftp->getErrors(), true) . "</pre>"); // error_log("<pre>" . print_r($sftp->getSFTPErrors(), true) . "</pre>"); error_log("<pre>" . print_r($sftp->getLog(), true) . "</pre>"); error_log("<pre>" . print_r($sftp->getSFTPLog(), true) . "</pre>");
代码能正常运行,但文件传输失败时仅$output变为null,无法获取错误日志或SFTP服务器的响应信息,请问需要修改哪些内容才能获取有效的日志消息或SFTP服务器响应?
解决方法
1. 修复语法错误
put方法调用存在引号未闭合的语法问题,这会导致逻辑异常,先修正:
$output = $sftp->put("//data//myfile.txt", "//sourceFile.txt", SFTP::SOURCE_LOCAL_FILE);
确保每个字符串参数都被正确闭合。
2. 启用完整错误捕获与日志
phpseclib3默认未完全开放错误日志,需调整以下配置:
- 开启PHP错误报告,确保运行时错误能被捕获:
error_reporting(E_ALL); ini_set('display_errors', 1); - 取消代码中注释的SFTP专属错误方法调用,获取协议层面的错误和日志:
error_log($sftp->getSFTPLastError()); error_log("<pre>" . print_r($sftp->getSFTPErrors(), true) . "</pre>"); - 测试阶段可改用
var_dump直接输出日志内容,比error_log更直观:var_dump($sftp->getSFTPErrors()); var_dump($sftp->getSFTPLog());
3. 修正路径格式
SFTP服务器路径通常使用单斜杠,双斜杠可能被解析为无效路径,建议调整:
$output = $sftp->put("/data/myfile.txt", "/sourceFile.txt", SFTP::SOURCE_LOCAL_FILE);
4. 校验登录状态
登录操作可能失败但未被检测,增加登录结果判断:
if (!$sftp->login('user', 'password')) { die('SFTP登录失败: ' . $sftp->getLastError()); }
内容的提问来源于stack exchange,提问作者Max B
相关产品推荐
相关产品推荐

