PHP Composer с использованием define

Я использую phpseclib, чтобы сделать некоторые вещи SFTP. В данный момент я не могу войти, и я пытаюсь выяснить, почему. В документации говорится, что я должен сделать что-то вроде этого

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
include 'Net/SFTP.php';

define('NET_SFTP_LOGGING', NET_SFTP_LOG_COMPLEX);

$sftp = new NET_SFTP('***');
if(!$sftp->login('***', '***')) {
    print_r($sftp->getSFTPErrors());
}

Итак, мне нужно определить тип ведения журнала, чтобы распечатать SFTPErrors.

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

use phpseclib\Net\SFTP;

Затем я продолжаю делать что-то вроде следующего

define('NET_SFTP_LOGGING', NET_SFTP_LOG_COMPLEX);

$sftp = new SFTP($config::SFTP_SERVER);

if(!$sftp->login($config::SFTP_USER, $config::SFTP_PASSWORD)) {
    print_r($sftp->getSFTPErrors());
    exit('Login Failed');
}

Однако если я сделаю это, я получу вывод

Notice:  Use of undefined constant NET_SFTP_LOG_COMPLEX - assumed 'NET_SFTP_LOG_COMPLEX' in ...
Array
(
)
Login Failed

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

Итак, как я могу определить эту константу в моем проекте композитора?

Спасибо

1 ответ

Несколько вещей.

Если вы используете версию PHP с пространством имен (о чем свидетельствуют ваши use phpseclib\Net\SFTP;) тогда вы используете ветку 2.0. Документация на сайте для ветки 1.0. Для ветки 2.0 вы должны сделать то, что предложил Феликс Сапарелли - SSH2::LOG_COMPLEX,

Тем не менее, ведение журнала не будет показывать ошибки SFTP. Ведение журнала показывает вам необработанные пакеты. Вот пример того, что производят журналы:

http://phpseclib.sourceforge.net/ssh/log.txt

Вы получаете эти журналы, делая $ssh->getLogs(),

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

Также, $sftp->getSFTPErrors() отлично подходит для ошибок SFTP, но при входе в систему вы можете получать ошибки SSH, а не ошибки SFTP. Вы получите ошибки SSH, выполнив $sftp->getErrors(), Дело в том... SFTP работает на более высоком уровне, чем SSH. SSH не будет успешным, если TCP/IP не может установить соединение, а SFTP не будет успешным, если SSH не сможет установить соединение. Таким образом, вы должны проверить все слои.

Наконец, вполне возможно, что сбой происходит по причинам, по которым ошибки не будут возвращены. Возможно, сервер требует сжатия, которое phpseclib не поддерживает. например.

http://www.frostjedi.com/phpbb3/viewtopic.php?p=221481

Я также не знаю, получите ли вы ошибку, если ключ или пароль, который вы использовали, были просто неверны.

Действительно, может быть любое количество причин невозможности подключения. Вы можете использовать selinux, который по умолчанию отключает исходящие соединения из сценариев PHP, работающих на порту 80, может возникнуть проблема с маршрутизацией и т. Д. (Все это влияет на fsockopen, но, в целом, существует множество потенциальных причин для недостаточность).

В целом, я бы сказал, что вы на правильном пути с журналами. Но делать $sftp->getLog() вместо $sftp->getSFTPErrors() а затем включите журналы в своем сообщении.

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