Ошибка типа при попытке установить PreferredAlgorithms

У меня возникли проблемы со следующим кодом. Это всего лишь раздел предварительного входа. Раньше это работало так: я получал ключ из файла. создайте новый объект sftp, установите предпочтительный алгоритм на ssh-dss (это единственный алгоритм, предлагаемый этим конкретным сервером), а затем войдите в систему. И все было хорошо. Должно быть, я обновил что-то на сервере, что привело к сбою, потому что код не изменился, но этот бит теперь сломан.

Я продолжаю получать эту ошибку:

array_intersect(): Argument #1 ($array) must be of type array, string given

Мы используем PHP 8.0.30
PHPSECLIB 3.0
На Ubuntu 20.04.6
Апач 2.4.62

Я видел подобные проблемы с WordPress, но ничего, что могло бы дать мне решение.

Если вы сможете помочь мне решить эту проблему, я буду очень благодарен.


$key = $this->__getKeyWithFile($mykey, $myphrase);
$sftp = new SFTP($host, $port);
if (!empty($sftp)) {
  try {
    $sftp->setPreferredAlgorithms(['hostkey' => 'ssh-dss']);
    $sftp->login($user, $key)
  } catch (Error $er) {
     echo $er->getMessage();
  } catch (Exception $ex) {
     echo $ex->getMessage();
  }
}

ОТРЕДАКТИРОВАНО ДЛЯ ДОБАВЛЕНИЯ полной ошибки. Моя вина. Однако проблема решена ниже.

PHP Fatal error:  Uncaught TypeError: array_intersect(): Argument #1 ($array) must be of type array, string given in /vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php:4623
Stack trace:
#0 /vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php(4623): array_intersect()
#1 FTPTools.php(105): phpseclib3\Net\SSH2->setPreferredAlgorithms()
#2 Reporter.php(1247): FTPTools->login()
#3 run_rebot.php(60): Reporter->myfunction()
#4 {main}
  thrown in /vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 4623

Я попробовал обновить свой сервер. Я попробовал переустановить phpseclib. Ни то, ни другое не сработало.

@DarkBee Потому что они передают неправильный тип, и именно об этом говорит ошибка. Если только они не поменяли название. Но да, как сказал DarkBee... покажите полный объект ошибки, чтобы мы могли взглянуть на array_intersect, на котором вы получаете ошибку. Вы можете сделать это самостоятельно, а затем просто сбросить значение. Или установите XDebug!

Paul Allsopp 04.09.2024 08:12

@PaulAllsopp Они не меняли заголовок, нет, но кажется, что array_intersect выдает ошибку TypeError (PHP 8+), а не предупреждение

DarkBee 04.09.2024 08:16

@DarkBee это неправильный тип, поэтому он выдает ошибку TypeError. Это обходит предупреждение, выдаваемое функцией. Функция должна выполнить оценку, чтобы получить предупреждение. Из-за ошибки типа он не может выполнить оценку.

Paul Allsopp 04.09.2024 08:24

Дело в том, что на компилируемом языке это будет эквивалентно ошибке времени компиляции, а не ошибке времени выполнения. Код даже не может быть запущен, поэтому он не может оценить функцию

Paul Allsopp 04.09.2024 08:28

В коде, указанном в вопросе, нет вызова array_intersect. Поэтому мы не можем видеть, что вы ему передали и куда. Трассировка стека ошибки должна точно показывать, в какой строке и в каком файле она возникла. Пожалуйста, предоставьте минимальный воспроизводимый пример проблемы. Если проблема связана с установленной вами сторонней библиотекой, убедитесь, что вы используете версию библиотеки, которая поддерживается используемой вами версией PHP.

ADyson 04.09.2024 13:05
I must have updated something on the server... Итак, просмотрите все изменения или обновления сервера, которые вы внесли за последнее время, и посмотрите, есть ли что-нибудь особенное.
ADyson 04.09.2024 13:06
Стоит ли изучать 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 и хотите разрабатывать...
2
6
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы делаете это:

$sftp->setPreferredAlgorithms(['hostkey' => 'ssh-dss']);

Когда вам следует это сделать:

$sftp->setPreferredAlgorithms(['hostkey' => ['ssh-dss']]);

Хороший улов. Вам хотелось бы думать, что функция проверит формат входных данных, прежде чем продолжить, но, видимо, нет!

ADyson 04.09.2024 15:31

СПАСИБО! Я слишком долго смотрел на это. Это помогло.

fliz 04.09.2024 16:14

@ADyson Но функция выполнила проверку, обнаружила ошибку типа и исключила исключение. Выполнение функции было отменено из-за ошибки типа... она даже не могла попытаться запуститься. Как ошибка времени компиляции и времени выполнения. Ошибка времени выполнения означает, что компилятор прошел проверку. В данном случае его даже невозможно было скомпилировать... это нужно было решить в первую очередь. Я знаю, что PHP не скомпилирован; Я просто использую это как аналогию.

Paul Allsopp 05.09.2024 01:40

@PaulAllsopp Я имел в виду, что setPreferredAlgorithms должен проверять ввод. Вместо этого он передал часть массива array_intersect, хотя это была строка, и это вызвало сбой. Более удобный API-интерфейс библиотеки откажется продолжать функцию или вызывать что-либо еще, если входные данные структурированы неправильно. Было бы проще вызвать код, чтобы понять, что не так, чем отлаживать внутренние компоненты библиотеки. Но это не существенно

ADyson 05.09.2024 02:26

@ADyson Да, я согласен. Они могли бы легко ускорить проверку и никогда не допустить, чтобы она дошла до этой точки. Извините, если я неправильно истолковал то, что вы сказали.

Paul Allsopp 05.09.2024 18:59

@PaulAllsopp, нет проблем, я, наверное, не так ясно выразился, как мог бы

ADyson 05.09.2024 19:07

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