2008-12-06 4 views
17

Ниже команда, которую я пытался выполнение без успеха:Как получить ответы об ошибках PHP exec()?

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

При добавлении штампа() в конце концов, он улавливает, что есть ошибка:

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

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

ответ

15

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

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

$ выход в этом случае будет иметь место только выход из sdtout не из sdterr – Amaynut

2

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

7

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

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

Если $ CMD держит команда ехес добавить что-то вроде этого:

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

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

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

6

Следующий код позволяет получить как нормальный выход (из STDOUT) и вывода сообщений об ошибках (от SdtErr).

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

Работал для меня :) – vijay

2

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

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

Пространство между "2 важно

Смежные вопросы