Для обычных команд, таких как 'ls', exec () работает нормально, например:
exec('ls',$output,$retval); var_dump($output,$retval); // $output contains an array of filenames, and retval === 0
Но при попытке выполнить другую программу я не могу получить вывод:
exec('some_command --a_parameter',$output,$retval); var_dump($output,$retval); // $output contains an empty array, end $retval === 0
Эта команда печатает некоторые строки при выполнении этого непосредственно из командной строки. Я знаю, что команда была успешной из-за результатов (некоторые файлы обновлены, данные добавлены и т. Д.), И все же я не вижу выход.
Есть идеи?
Похоже, программа выводит свои предупреждения на стандартную ошибку, а не на стандартный вывод. exec
будет exec
только стандартный вывод. Я точно не знаю, что стандартная ошибка всегда отправляется в журнал ошибок apache, но это кажется вероятным.
Если вам не нужна совместимость с системами non * nix, вы можете перенаправить стандартную ошибку на стандартный вывод, добавив 2>&1
в команду:
exec('some_command --option 2>&1', $output, $ret);
Это должно сделать предупреждения доступными для вашей php-программы и предотвратить ненужное ведение журнала.
Весь вывод отправлялся на httpd / error_log, когда по какой-либо причине, когда приложение обнаружило предупреждение (что-то внутреннее, даже не смертельное)
Мое решение: когда нет выхода, предположим, что оно не выполнено. Мои журналы apache будут грязными, но что угодно.