phpseclib превысил максимальное время выполнения

В настоящее время я использую laravel (который использует phpseclib) для своего проекта, и у меня были проблемы с ssh-соединением, получая ошибку Maximum execution time of 60 seconds exceeded, теперь я знаю, что это значение можно расширить, но мне не нужно было запускать простую команду ls.

кажется, в этом классе не работает phpseclib/Math/BigInteger.php

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

Я также пытался использовать exec("ssh -i /path/to/key user@host ls", $out, $code);, и я могу подключиться очень хорошо.

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

  $fsock = fsockopen('server', 22);
  echo fgets($fsock, 1024);

есть идеи, почему это происходит?


person arrowill12    schedule 20.05.2014    source источник
comment
Попробуйте отладить ssh, добавив опцию -v. Это покажет что-то полезное exec("ssh -v -i /path/to/key user@host ls", $out, $code);   -  person Harikrishnan    schedule 20.05.2014
comment
Я могу подключиться с помощью этого метода... Я не могу подключиться с помощью библиотеки phpseclib   -  person arrowill12    schedule 20.05.2014


Ответы (1)


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

здесь:

начиная со строки 256

из этого :

       switch (true) {
            case !isset($versions['Header']):
            case !isset($versions['Library']):
            case $versions['Header'] == $versions['Library']:
                define('MATH_BIGINTEGER_OPENSSL_ENABLED', true);
                break;
            default:
                define('MATH_BIGINTEGER_OPENSSL_DISABLE', true);
        }

к этому:

      switch (true) {
            case !isset($versions['Header']):
            case !isset($versions['Library']):
            case $versions['Header'] == $versions['Library']:
                define('MATH_BIGINTEGER_OPENSSL_ENABLED', true);
                break;
            default:
                define('MATH_BIGINTEGER_OPENSSL_ENABLE', true);
        }
person arrowill12    schedule 20.05.2014
comment
Это было добавлено, потому что, когда версии OpenSSL не совпадают, OpenSSL может аварийно завершать работу на stackoverflow.com/q/16628102/569976 . Можете ли вы опубликовать копию вашего phpinfo()? В частности, мне интересно, если (1) вы используете внутренний режим и (2) если ваши целые числа являются int64 на stackoverflow.com /a/23608651/569976 . Конечно, ваш тайм-аут также может быть очень низким. Действительно, лучший способ ускорить его, согласно phpseclib.sourceforge.net/math/intro.html. будет использовать gmp. - person neubert; 21.05.2014
comment
этот коммит действительно решил проблему, хотя он все еще намного медленнее, чем когда у меня был включен OPenssl. - person arrowill12; 21.05.2014
comment
Это меня не удивляет. phpseclib использует режим чистого PHP как крайнюю меру, когда ничего другого не доступно. Хотя это сказано, поскольку вы используете Linux, и кажется, что проблема сбоя OpenSSL затрагивает только пользователей XAMPP, возможно, автор phpseclib мог бы сделать так, чтобы проверка выполнялась только тогда, когда ОС является Windows idk. - person neubert; 21.05.2014