Задать вопрос

Как работают system() exec() и прочее в PHP?

Добрый день.

Вопрос в следующем - в php есть функции, которые выполняют системные программы и отображают их вывод. Их много и по сути работают одинаково. Но вот есть одно но. Не выполняется через них ни одна установленная программа. Например, я хочу конвертировать файл

exec('enconv filepath');
Такое не работает. То же самое пытаюсь сделать через консоль, все прекрасно выполняется.
Пробовал прописывать полный путь до бинарника.
/usr/bin/enconv
разницы нет. Также пути к файлам перепробовал все, которые только можно. Ничего не работает.

Функции я, естественно, разрешил. Также пробовал в консоли выполнить от пользователя www-data - все выполняется. А вот через php скрипт не хочет.

Но, например, вызовы
exec('echo 1');
exec('file -i filename');

спокойно отрабатывают, и в выводе я вижу информацию.
Подскажите, пожалуйста, в чем может быть затык?
  • Вопрос задан
  • 3587 просмотров
Подписаться 4 Оценить 1 комментарий
Решения вопроса 1
@whats Автор вопроса
Хотелось бы дать решение если кому интересно.
Если мы хотим в Php эмулировать консоль со всеми ее ответами в Php, стоит использовать такую конструкцию.
$cmd = 'enconv /var/www/documents/xxx/\(1\)-1402322554-file -x utf8 -L russian';
$process = proc_open($cmd,
        array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w')), $pipes, NULL, NULL)) {
            echo "<b>$cmd</b><br/>";
            echo "OUTPUT:".stream_get_contents($pipes[1])."<br/>";
            echo "ERRORS:".stream_get_contents($pipes[2])."<br/>";
            echo "<br/>";
        }

Так мы получаем всю информацию которую нам возвращает консоль. Все ошибки возвращаются так же. Очень удобно когда пишется программа которая использует внешние вызовы программ в коде.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
У пользователя который пробует запустит /usr/bin/enconv скорее всего нет на это прав.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы