nginx上的PHP exec函数;t识别系统环境变量


PHP exec function on nginx doesn't recognize system environment variables

我尝试在PHP中使用exec函数,用gcc编译一个源文件,代码如下。

<?php
exec("gcc -o hello hello.c 2>&1", $output, $return_value);
echo $output[0];

我在通过web浏览器调用时得到了以下输出(我使用nginx作为web服务器)。

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"

所以,我认为问题是我的Web服务器(nginx)不知道系统路径环境变量来查找gcc和其他gcc依赖项所在的/usr/bin。

如何让PHP exec函数识别nginx上的系统环境变量?

操作系统:Ubuntu 14.04

nginx:1.6.2

PHP 5.5.9

我在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在同一目录中可用。它是有效的。

我现在正在寻找更好的解决方案…:)

为PHP设置PATH变量,因为它可能依赖于自己的环境变量,而忽略系统的PATH变量。

例如,我在.env文件的底部有以下行:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

这样,执行gcc(不给出完整路径/usr/bin/gcc)就可以正常工作。

如何从php编译GCC的副本。我想我也会在这里发布答案,因为这个问题比另一个问题受到了更多的关注。