Я использую приведенный ниже код для передачи файлов на 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 становится нулевым). Что мне нужно изменить, чтобы получать правильные сообщения журнала или, по крайней мере, ответы от SFTP-сервера в случае каких-либо проблем?
@ChrisHaas Я искал способ получить некоторые подробности журналирования, не взламывая первоисточник.
Я это полностью понимаю. Я говорю о том, что некоторые вещи не протоколируются, и вам, возможно, придется временно взломать их, просто чтобы посмотреть, не допускаете ли вы ошибку или нет ли ошибки в их коде.
error_log("<pre>" . print_r($sftp->getSFTPLog(), true) . "</pre>"); — вам нужно будет сделать define('NET_SFTP_LOGGING', 2) в верхней части файла, чтобы это сработало. Но, в конечном счете, я бы сказал, что получение журналов SFTP, вероятно, будет для вас наиболее полезным. Получите их, опубликуйте на Pastebin.com, а затем отредактируйте свое сообщение, включив в него ссылку. А затем ответьте здесь, оставив комментарий @neubert.
@neubert, спасибо за ваш вклад, это помогло!






копирую комментарий @neubert здесь, чтобы показать правильный ответ на мой вопрос:
вам нужно будет выполнить define('NET_SFTP_LOGGING', 2) в верхней части файла, чтобы это работало.
Активировать вход phpseclib можно методом enableLog(). Кроме того, установите свойство logIdent, чтобы различать источник записей журнала.
use phpseclib3\Net\SFTP;
// Define a callback function for logging
function customLogger($message)
{
error_log($message);
}
// Enable logging and set the log callback function
SFTP::enableLog('customLogger');
SFTP::$logIdent = 'MySFTPClient';
$sftp = new SFTP('localhost');
if (!$sftp->login('user', 'password')) {
error_log('Login failed');
exit;
}
error_log('Current directory: ' . $sftp->pwd());
foreach ($fileList as $key => $value) {
$output = $sftp->put('//data//myfile.txt', '//sourceFile.txt', SFTP::SOURCE_LOCAL_FILE);
error_log('Put operation result: ' . var_export($output, true));
}
error_log('Last SFTP error: ' . $sftp->getLastError());
error_log('phpseclib errors: ' . print_r($sftp->getErrors(), true));
error_log('SFTP errors: ' . print_r($sftp->getSFTPErrors(), true));
error_log('phpseclib logs: ' . print_r($sftp->getLog(), true));
error_log('SFTP logs: ' . print_r($sftp->getSFTPLog(), true));
Если я попробую, то получу PHP Fatal error: Uncaught Error: Call to undefined method phpseclib3\Net\SFTP::enableLog()
Метод
put()должен возвращать логическое значение, а не нулевое значение, поэтому я предполагаю, что возвращаетсяfalse. Глядя на источник метода put, есть несколько мест, куда он возвращаетсяfalseничего не регистрируя, возможно, стоит поставить в этих местах несколько точек останова или что-то подобное, чтобы определить, где происходит возврат.