Я не могу заставить phpseclib работать

Что я хочу сделать

Я хочу upload/download файл через sftp с помощью php. phpseclib-library выглядит очень многообещающе.

Что я уже сделал

Я изменил свой conposer.json на:

{
    "require": {
        "nicolab/php-ftp-client":"*",
        "php-curl-class/php-curl-class":"*",
        "phpseclib/phpseclib":"*"
    }
}

Затем я обновил свой каталог. Composer установил библиотеку в папку поставщика.

Проблема

Проблема в том, что я не могу создать новый SFTP-Object.

Fatal error: Class 'SFTP' not found in...

Я также пробовал NET_SFTP в качестве имени класса, но это тоже не сработало. Одного я не понимаю, почему on указывает, что имя класса NET_SFTP, когда в источнике он явно называется SFTP.

Также автозагрузка, похоже, не работает.

Я добавил echo "testline"; в библиотеку, чтобы посмотреть, загружен ли файл. Ничего не происходит, если я использую автозагрузку. если я вручную включаю файл, печатается "testline", но класс все еще не найден.

Мой код

Пример первый

<?php
include '/vendor/autoload.php';

$sftp = new SFTP('domain');
if (!$sftp->login('user', 'pass')) {
    exit('Login Failed');
}

-> нет эха

Пример второй:

<?php
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib/phpseclib');

include('Net/SSH2.php');

include('Net/SFTP.php');

$sftp = new SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

-> эхо

В обоих примерах он не может найти класс.


person Simon Balling    schedule 27.10.2015    source источник
comment
Просто хотел отметить для phpseclib 3.0 его use phpseclib3\Net\SFTP;   -  person Ronnie    schedule 08.04.2021


Ответы (1)


Одного я не понимаю, почему на http://phpseclib.sourceforge.net/sftp/examples.html#stat в нем указано, что имя класса — NET_SFTP, хотя в источнике он явно называется SFTP.

Веб-сайт документирует ветку 1.0. Ветвь 2.0 имеет аналогичный API, но он не идентичен. В частности, он имеет пространство имен, а ветвь 1.0 — нет.

Чтобы изменить свой первый пример...

<?php
include '/vendor/autoload.php';

$sftp = new \phpseclib\Net\SFTP('domain');
if (!$sftp->login('user', 'pass')) {
    exit('Login Failed');
}

API главной ветки может быть изменен. Только 1.0 и 2.0 имеют фиксированные API. Таким образом, я думаю, что обновление вашего composer.json также будет уместным. т.е. сделать "phpseclib/phpseclib": "~2.0" вместо *.

person neubert    schedule 27.10.2015