大家好我正在尝试使用exec和Laravel Framework从PHP编译一个C程序,但我不认为这是问题,因为我可以从终端编译和执行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:没有这样的文件或目录“
我检查了权限,事实上我在绝望的XD中做了chmod 777 此外,我尝试重新安装一切,但它不起作用。 我很沮丧,我希望你能帮助我。
对不起我的英语,如果我犯了语法错误,谢谢我等待你的帮助:D
答案 0 :(得分:4)
问题是,通过浏览器调用的应用程序通过正在处理Apache实例的用户来运行。如果这不是根(或其他特权用户),则它可能没有访问权限。此外,这将可能指示应用程序尝试从哪个目录执行。
当您从CLI执行时,用户是拥有终端实例的任何人(当然,除非su'd
)。
答案 1 :(得分:1)
这是如何完成此工作的最小示例:
首先,创建一个新目录并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确实可以在其查找的位置找到。< / p>
如果它可以在终端上运行,而不能在PHP上运行,则将调试命令放入PHP脚本中,直到找到破坏它的区别。
如果您完全缺少cc1
,请执行sudo apt --reinstall install build-essential
,或者执行任何等效的操作来重新安装gcc及其对发行版的依赖。