Подтвердить что ты не робот

Как получить ответы об ошибках PHP exec()?

Ниже приведена команда, которую я пытался выполнить, без успеха:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess');

Когда вы добавляете в конец штамп(), он обнаруживает ошибку:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess') or die('what?!');

Для вышеупомянутого оператора exec() проблема с разрешениями вызывает ошибку, но PHP не отображает ее. Как вы показываете из PHP, какая ошибка возникает?

4b9b3361

Ответ 1

Вы можете получить выходной результат exec function, передав необязательный второй параметр:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess',$output);
var_dump($output);

Ответ 2

Параметр $output не работает, если вызывающая программа выводит вывод в STDERR.

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

Если $cmd содержит команду exec, добавьте что-то вроде этого:

$cmd.=" > $error_log 2>&1"

Затем просмотрите содержимое файла спецификаций в $error_log для получения подробной информации о том, почему команда не удалась.

Также обратите внимание, что если вы отключаете это с помощью и в конце команды, немедленная проверка содержимого $error_log может не показывать информацию журнала - script может проверить/обработать файл перед ОС закончил.

Ответ 3

В следующем коде будут отображаться как нормальный выход (из StdOut), так и вывод ошибки (из SdtErr).

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess' . '2>&1',$output);
var_dump($output);

Ответ 5

Это сработало для меня в нескольких сценариях:

 ob_start();
 exec($cmd . " 2>&1", $output);
 $result = ob_get_contents();
 ob_end_clean();
 var_dump($output);

Пробел между "2 важен

Ответ 6

Если вы не нашли ошибку через этот второй параметр, вы можете выполнить поиск журнала ошибок apache, например, в Ubuntu Server 12.10 с помощью команды $ tail/var/log/apache2/error.log Я запускал python script из php, чья ошибка была напечатана только там, и, следовательно, я смог его диагностировать. С наилучшими пожеланиями.

Ответ 7

Это не является прямым ответом на ваш вопрос, но очень полезно, если вы хотите знать, что именно произошло с возвращенным кодом ошибки.

Если код ошибки ($ res), возвращается командой:

exec('command', $out, $res);

находился в диапазоне 1-2, 126-165, 255, чем было возвращено оболочкой (например, BASH), вызванной из PHP (для выполнения вашей команды). Если возвращенный код не находится в этом диапазоне, то он был возвращен вашей командой (не оболочкой).

Смотрите (для описания кода ошибки BASH)

https://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/exitcodes.html