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

时间:2015-04-03 11:55:46

标签: php gcc nginx environment-variables exec

我尝试在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

2 个答案:

答案 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的重复。我以为我也会在这里发布答案,因为这个问题比其他问题更受关注。