Компиляция C из PHP с ошибкой exec при попытке выполнить exc ‘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: ошибка при попытке выполнить exc ‘cc1’: execvp: такого файла или каталога нет «

Я проверил разрешения и прав, на самом деле я сделал chmod 777 в моем отчаянии XD
Также я пытаюсь переустановить все, но это не работает.
Я расстроен, ребята, я надеюсь, вы можете помочь мне, пожалуйста.

Извините за мой английский, если я сделал грамматическую ошибку, спасибо, я жду вашей помощи: D

6

Решение

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

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

4

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

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

Сначала создайте новый каталог и 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: // локальный: 8080 и PHP-скрипт скомпилирует и запустит эту C-программу.

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

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

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

1

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