Как я могу получить журналирование из phpseclib и SFTP?

Я использую приведенный ниже код для передачи файлов на 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-сервера в случае каких-либо проблем?

Метод put() должен возвращать логическое значение, а не нулевое значение, поэтому я предполагаю, что возвращается false. Глядя на источник метода put, есть несколько мест, куда он возвращается false ничего не регистрируя, возможно, стоит поставить в этих местах несколько точек останова или что-то подобное, чтобы определить, где происходит возврат.

Chris Haas 05.10.2023 19:24

@ChrisHaas Я искал способ получить некоторые подробности журналирования, не взламывая первоисточник.

Max B 06.10.2023 11:19

Я это полностью понимаю. Я говорю о том, что некоторые вещи не протоколируются, и вам, возможно, придется временно взломать их, просто чтобы посмотреть, не допускаете ли вы ошибку или нет ли ошибки в их коде.

Chris Haas 06.10.2023 15:21
error_log("<pre>" . print_r($sftp->getSFTPLog(), true) . "</pre>"); — вам нужно будет сделать define('NET_SFTP_LOGGING', 2) в верхней части файла, чтобы это сработало. Но, в конечном счете, я бы сказал, что получение журналов SFTP, вероятно, будет для вас наиболее полезным. Получите их, опубликуйте на Pastebin.com, а затем отредактируйте свое сообщение, включив в него ссылку. А затем ответьте здесь, оставив комментарий @neubert.
neubert 06.10.2023 18:57

@neubert, спасибо за ваш вклад, это помогло!

Max B 09.10.2023 10:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
5
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

копирую комментарий @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()

Max B 09.10.2023 13:36

Другие вопросы по теме