У меня возникли проблемы со следующим кодом. Это всего лишь раздел предварительного входа. Раньше это работало так: я получал ключ из файла. создайте новый объект 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. Ни то, ни другое не сработало.
@PaulAllsopp Они не меняли заголовок, нет, но кажется, что array_intersect выдает ошибку TypeError (PHP 8+), а не предупреждение
@DarkBee это неправильный тип, поэтому он выдает ошибку TypeError. Это обходит предупреждение, выдаваемое функцией. Функция должна выполнить оценку, чтобы получить предупреждение. Из-за ошибки типа он не может выполнить оценку.
Дело в том, что на компилируемом языке это будет эквивалентно ошибке времени компиляции, а не ошибке времени выполнения. Код даже не может быть запущен, поэтому он не может оценить функцию
В коде, указанном в вопросе, нет вызова array_intersect. Поэтому мы не можем видеть, что вы ему передали и куда. Трассировка стека ошибки должна точно показывать, в какой строке и в каком файле она возникла. Пожалуйста, предоставьте минимальный воспроизводимый пример проблемы. Если проблема связана с установленной вами сторонней библиотекой, убедитесь, что вы используете версию библиотеки, которая поддерживается используемой вами версией PHP.
I must have updated something on the server... Итак, просмотрите все изменения или обновления сервера, которые вы внесли за последнее время, и посмотрите, есть ли что-нибудь особенное.






Вы делаете это:
$sftp->setPreferredAlgorithms(['hostkey' => 'ssh-dss']);
Когда вам следует это сделать:
$sftp->setPreferredAlgorithms(['hostkey' => ['ssh-dss']]);
Хороший улов. Вам хотелось бы думать, что функция проверит формат входных данных, прежде чем продолжить, но, видимо, нет!
СПАСИБО! Я слишком долго смотрел на это. Это помогло.
@ADyson Но функция выполнила проверку, обнаружила ошибку типа и исключила исключение. Выполнение функции было отменено из-за ошибки типа... она даже не могла попытаться запуститься. Как ошибка времени компиляции и времени выполнения. Ошибка времени выполнения означает, что компилятор прошел проверку. В данном случае его даже невозможно было скомпилировать... это нужно было решить в первую очередь. Я знаю, что PHP не скомпилирован; Я просто использую это как аналогию.
@PaulAllsopp Я имел в виду, что setPreferredAlgorithms должен проверять ввод. Вместо этого он передал часть массива array_intersect, хотя это была строка, и это вызвало сбой. Более удобный API-интерфейс библиотеки откажется продолжать функцию или вызывать что-либо еще, если входные данные структурированы неправильно. Было бы проще вызвать код, чтобы понять, что не так, чем отлаживать внутренние компоненты библиотеки. Но это не существенно
@ADyson Да, я согласен. Они могли бы легко ускорить проверку и никогда не допустить, чтобы она дошла до этой точки. Извините, если я неправильно истолковал то, что вы сказали.
@PaulAllsopp, нет проблем, я, наверное, не так ясно выразился, как мог бы
@DarkBee Потому что они передают неправильный тип, и именно об этом говорит ошибка. Если только они не поменяли название. Но да, как сказал DarkBee... покажите полный объект ошибки, чтобы мы могли взглянуть на array_intersect, на котором вы получаете ошибку. Вы можете сделать это самостоятельно, а затем просто сбросить значение. Или установите XDebug!