Компиляция C из PHP с ошибкой выполнения при попытке выполнить «cc1»

Я пытаюсь скомпилировать программу C из PHP с помощью exec и Laravel Framework. Но я не думаю, что это проблема, потому что я могу без проблем компилировать и выполнять программы на C с терминала. И если вы знаете из тинкера в Laravel 5, значит, проблема в PHP. Но я не могу найти ошибку, я думаю, что проблема в разных версиях GCC, но почему мне нужно скомпилировать из терминала.

Я получаю эту ошибку, когда делаю это с PHP. Если я компилирую из терминала, он работает, а из php нет.

    $path = public_path("testing/cosas.out");
    exec("gcc testing/pruebaC.c -o testing/from.out 2>&1",$output,$status);
    dd($output,$status); //is like var_dump

И Я ЭТО ПОНИМАЮ!!

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

Я проверил разрешения и прав (на самом деле я сделал chmod 777 в своем отчаянии).

Также пробовал все переустанавливать, но не получается.


person Marco Feregrino    schedule 23.10.2015    source источник
comment
Распечатать и показать env на exec   -  person Gasol    schedule 24.10.2018


Ответы (2)


Проблема в том, что ваше приложение при вызове через браузер работает через пользователя, который обрабатывает экземпляр Apache. Если это не root (или другой привилегированный пользователь), то у него может не быть доступа. Кроме того, это вероятно определяет, из какого каталога приложение пытается выполниться.

Когда вы выполняете из CLI, пользователем является тот, кто владеет экземпляром терминала (если, конечно, не su'd).

person Ohgodwhy    schedule 23.10.2015
comment
Я использую ngix... но я сделал chmod 777 в usr/bin/gcc, так что каждый может его вызвать. Это разрешает разрешения, не так ли? - person Marco Feregrino; 23.10.2015
comment
Итак, как я могу скомпилировать из PHP? :( - person Marco Feregrino; 23.10.2015
comment
Эй, я также столкнулся с той же проблемой. У вас есть какое-нибудь решение? - person Abhi; 20.10.2018

Вот минимальный пример того, как заставить это работать:

Сначала создайте новый каталог и cd в него. В этом каталоге создайте index.php со следующим содержимым:

<?php
exec("gcc /var/www/html/test.c -o /tmp/a.out 2>&1",$compile_output,$compile_status);
var_dump($compile_output);
var_dump($compile_status);

exec("/tmp/a.out 2>&1",$run_output,$run_status);
var_dump($run_output);
var_dump($run_status);
?>

И создайте test.c с таким содержимым:

#include <stdio.h>
int main(void) {
        puts("Hello from C compiled by PHP!");
        return 0;
}

Затем выполните docker run -p 8080:80 -v /whatever/directory/you/created:/var/www/html php:apache. Наконец, перейдите по адресу http://localhost:8080, и PHP-скрипт скомпилирует и запустит эту программу на C.

Если это работает в Docker, но не в «реальной» среде, то ваша среда как-то настроена неправильно. В частности, проверьте PATH, чтобы убедиться, что вы используете именно тот gcc, которым, по вашему мнению, являетесь, и проверьте вывод gcc -print-search-dirs и убедитесь, что cc1 действительно можно найти где-то там, где он ищет.

Если он работает с терминала, но не с PHP, то поместите команды отладки в скрипт PHP, пока не найдете разницу, которая его ломает.

Если вам полностью не хватает cc1, выполните sudo apt --reinstall install build-essential или что-то подобное, чтобы переустановить gcc и его зависимости в вашем дистрибутиве.

person Joseph Sible-Reinstate Monica    schedule 20.10.2018