【问题标题】:PHP exec function on nginx doesn't recognize system environment variablesnginx 上的 PHP exec 函数无法识别系统环境变量
【发布时间】:2015-06-08 12:24:32
【问题描述】:

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

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

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

操作系统:Ubuntu 14.04

nginx:1.6.2

PHP 5.5.9

【问题讨论】:

    标签: php gcc nginx environment-variables exec


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我在 Arch Linux 上使用 nginx 1.10 和 PHP 5.6 时遇到了同样的问题(完全相同...)。 相同的 PHP 代码在 Apache/Debian 上运行。 在尝试 Arch/Nginx 服务器时,我遇到了 cc1 错误...我将 gcc 替换为 /usr/bin/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 相同的目录中可用。 它有效。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-21
        • 2016-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多