Я пытаюсь использовать 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
Я застрял на той же проблеме (точно так же …), используя 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.
И это работает.
Я сейчас ищу лучшее решение … 🙂
Установить PATH
переменная для PHP, так как она может полагаться на свои собственные переменные окружения и игнорировать системные PATH
переменная.
Например, у меня есть следующая строка в нижней части моего .env
файл:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
С этим, выполняя gcc
(без указания полного пути /usr/bin/gcc
) работает правильно.
Дубликат Как скомпилировать GCC из php. Думаю, я также опубликую ответ здесь, так как этот вопрос получил гораздо больше внимания, чем другой.