gcc — PHP-функция exec на nginx не распознает системные переменные окружения

Я пытаюсь использовать Exec функция в PHP для компиляции исходного файла с НКУ со следующим кодом.

<?php
exec("gcc -o hello hello.c 2>&1", $output, $return_value);
echo $output[0];

Я получил следующий вывод при вызове через веб-браузер (я использую nginx в качестве веб-сервера).

gcc: ошибка при попытке выполнить exc ‘cc1’: execvp: такого файла или каталога нет

Тем не менее, если я бегу gcc -o привет привет непосредственно в командной оболочке или вызовите php my_file.php непосредственно на оболочке, оба способа успешно компилируются.

Если я добавлю абсолютный путь к gcc в моем коде PHP следующим образом:

<?php
exec("/usr/bin/gcc -o hello hello.c 2>&1", $output, $return_value);
echo $output[0];

Я получил следующий вывод.

collect2: фатальная ошибка: не могу найти ‘ld’

Итак, я думаю, что проблема в том, что мой веб-сервер (nginx) не знает переменную окружения системного пути для поиска / usr / bin, в которой находятся gcc и другие gcc-зависимости.

Как я могу позволить функции PHP exec распознавать системные переменные окружения в nginx?

ОС: Ubuntu 14.04

nginx: 1.6.2

PHP 5.5.9

1

Решение

Я застрял на той же проблеме (точно так же …), используя nginx 1.10 и PHP 5.6 на Arch Linux.
Тот же PHP-код работал на Apache / Debian.
При попытке использования сервера Arch / Nginx у меня возникла ошибка cc1 … Я заменил gcc на / usr / bin / gcc …. и теперь я застрял на «collect2: fatal error: not find ‘ld'»

Такая же компиляция работает с оболочкой … и ld находится в / usr / bin. Это просто не работает при использовании «exec» в PHP.

Не удовлетворяющее (но работающее …) решение

Запустив gcc -v ….. (просто добавьте -v в строку компиляции), я мог видеть:

...
COLLECT_GCC_OPTIONS='-v' '-D' 'exit=noexit' '-D' '_exit=noexit' ...
/usr/lib/gcc/x86_64-pc-linux-gnu/6.1.1/collect2 -plugin ... (<= very long line)
collect2: fatal error: cannot find 'ld'

Тогда я сделал:

cd /usr/lib/gcc/x86_64-pc-linux-gnu/6.1.1/  # <- path to collect2 (see above)
ln -s /usr/bin/ld ld

Теперь ld prog доступен в том же каталоге, что и collect2.
И это работает.

Я сейчас ищу лучшее решение … 🙂

0

Другие решения

Установить PATH переменная для PHP, так как она может полагаться на свои собственные переменные окружения и игнорировать системные PATH переменная.

Например, у меня есть следующая строка в нижней части моего .env файл:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

С этим, выполняя gcc (без указания полного пути /usr/bin/gcc) работает правильно.

Дубликат Как скомпилировать GCC из php. Думаю, я также опубликую ответ здесь, так как этот вопрос получил гораздо больше внимания, чем другой.

0

По вопросам рекламы [email protected]