我尝试在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的副本。我想我也会在这里发布答案,因为这个问题比另一个问题受到了更多的关注。