我尝试在PHP中使用 exec 函数,使用以下代码使用 gcc 编译源文件。
<?php
exec("gcc -o hello hello.c 2>&1", $output, $return_value);
echo $output[0];
通过网络浏览器调用时,我得到了以下输出(我使用nginx作为网络服务器)。
gcc:尝试执行'cc1'时出错:execvp:没有这样的文件或目录
但是,如果我直接在命令shell上运行 gcc -o hello hello.c 或直接在shell上使用 php my_file.php 调用,则两种方式都可以成功编译。
如果我在我的PHP代码中附加gcc的绝对路径,如下所示:
<?php
exec("/usr/bin/gcc -o hello hello.c 2>&1", $output, $return_value);
echo $output[0];
我得到了以下输出。
collect2:致命错误:找不到'ld'
所以,我认为问题是我的webserver(nginx)不知道系统路径环境变量来查找gcc和其他gcc-dependencies所在的/ usr / bin。
如何让PHP exec函数识别nginx上的系统环境变量?
操作系统:Ubuntu 14.04
nginx:1.6.2
PHP 5.5.9
答案 0 :(得分:0)
我在Arch Linux上使用nginx 1.10和PHP 5.6时遇到了同样的问题(完全相同......) 相同的PHP代码正在使用Apache / Debian。 在尝试Arch / Nginx服务器时,我遇到了cc1错误......我用/ usr / bin / gcc替换了gcc ....我现在卡在“collect2:致命错误:找不到'ld'”
相同的编译适用于shell ...而ld位于/ usr / bin中。在PHP中使用“exec”时它不起作用。
通过运行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相同的目录中可用。 它有效。
我正在寻找更好的解决方案...... :)
答案 1 :(得分:0)
为PHP设置PATH
变量,因为它可能依赖于自己的环境变量而忽略系统的PATH
变量。
例如,我的.env
文件底部有以下行:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
这样,执行gcc
(不提供完整路径/usr/bin/gcc
)就可以正常工作。
How compile GCC from php的重复。我以为我也会在这里发布答案,因为这个问题比其他问题更受关注。