【问题标题】:Can't execute PHP script using PHP exec无法使用 PHP exec 执行 PHP 脚本
【发布时间】:2010-10-08 15:37:53
【问题描述】:

我正在尝试使用 PHP exec 调用来调用一个需要几秒钟的脚本(具有 3rd 方的 Web 服务)。经过一番挣扎,我将其简化为经典的 hello world 示例。调用脚本如下:

exec('/usr/bin/php /home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &');

当我运行它时,输出 execoutput.txt 包含调用脚本页面的副本,而不是我预期的 hello world

为什么我不能让这个 PHP 脚本使用 exec 来执行?请注意,当我将命令更改为 ls -l 之类的命令时,输出是预期的目录列表。顺便说一句,以防万一,我将调用的脚本 chmod 到 755...

更新 - 我将 exec 调用移到调用脚本的末尾,至少现在我看不到在输出中执行的调用脚本。感谢海报,我会尝试其中的一些想法。

救命!

谢谢 史蒂夫

【问题讨论】:

    标签: php exec


    【解决方案1】:

    这就像从浏览器运行脚本一样运行。

    这是在 linux 平台上进行项目时遇到的。

    exec('wget http://<url to the php script>)
    

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      如果您只是简单地运行 php 脚本,执行整个代码的一种可能方法是使用 include(),它将运行 php 文件并输出任何结果。您不能将输出定向到文本文件,但如果您是 Hello World php 脚本,它应该出现在浏览器窗口中

      <?php echo "Hello World!"; ?>
      

      然后它将在浏览器中吐出。所以你的第二个代码看起来像

      <?php include("helloWorld.php");  echo " PHP ROCKS";?>
      

      生成的页面看起来像,

      世界你好! PHP 岩石

      【讨论】:

        【解决方案3】:

        我也遇到了这个问题,结果证明这是 php (#11430) 中的一个错误。修复方法是在 php 脚本中调用另一个 php 脚本时使用 php-cli。所以你仍然可以使用 exec 而不是使用 php 在浏览器中调用它时使用 php-cli:

        exec("php-cli  somescript.php");
        

        这对我有用。

        【讨论】:

        • 这对我也有用。希望我早点看到这个答案,会解决 5 小时的头痛。
        • 我一直在寻找这个 HOURS 并且正要放弃。请注意,如果您使用的是 PHPSuEXEC,这似乎没有必要,但是一旦您禁用 suexec,您必须按照指定使用 php-cli。
        • 我也为此苦苦思索了很长时间。真正的难题是在 ubuntu 下使用 exec 和“php”似乎可以正常工作,但是当我部署到 centos 服务器时,它就不起作用了。 php-cli 是答案,谢谢!
        • 解决了三天的头痛问题。我们的测试服务器没有这个问题,因此尝试修复它是一个主要问题。
        • 它真的很棒!.. 非常感谢。如果我运行 exec("php somescript.php");它占用了太多内存,为什么?
        【解决方案4】:

        为了避免上述 PHP 在这方面的问题,为什么不把它放在一个 shell 脚本中呢?然后 PHP 可以执行 shell 脚本,该脚本在内部处理了所有重定向。

        如果你需要动态改变一些东西,那为什么不编写 shell 脚本然后执行它(当然,事后清理)?

        【讨论】:

          【解决方案5】:

          问题在于 PHP 本身,它将脚本中的所有内容都视为 $argv。它不会将输出重定向到 /dev/null 的文件。

          前段时间我也遇到过同样的问题。我所做的是在 /opt/php-bin 中创建一个runscript.php,然后在这个脚本中运行它应该运行的内容。像这样的:

          $script = $argv[1]
          $params = implode(' ', array_slice($argv, 2));
          $cmd    = "{$script} {$params} > /dev/null &";
          
          $output = array();
          $return = 0;
          exec("php {$cmd}", $output, $return);
          
          exit((int)$return);
          

          然后你调用它:

          exec('/opt/php-bin/runscript.php /path/to/your/script.php arg1 arg2')
          

          这是我设法让它工作的唯一方法。

          【讨论】:

            【解决方案6】:

            exec 正在做的是获取最右边的命令并将其附加到您的目的地。如果您的 php 脚本中有 shebang 行,则不需要包含 php 解释器的二进制指令。

            如果您只想要脚本的输出,请尝试:

            exec('/home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &')
            

            但是,如果您不希望错误出现在文件中,则应在输出到文件之前重定向 STDERR。像这样:

            exec('/home/quote2bi/tmp/helloworld.php 2> /dev/null > /tmp/execoutput.txt')
            

            上面应该只将“Hello World”输出到 execoutput。

            编辑:

            有趣的是你得到了这种行为。你说命令“ls”有效。尝试为此创建别名并将其转发到如下文件:

            alias pexec='php /home/quote2bi/tmp/helloworld.php'

            然后

            exec('pexec > /tmp/execoutput.txt 2>&1 &')
            

            这似乎是 exec 处理输入的方式而不是 shell 本身的问题。

            -约翰

            【讨论】:

            • John - 感谢您的回复,但不幸的是,它对我不起作用。当我尝试时: exec('/home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &') ...我得到了相同的结果(输出文件中的当前页面)。第二个 exec 被阻止(缺少 &) - 添加时我得到了相同的结果。
            • 如果我的服务器上禁用了 exec() 功能是否有任何选项
            猜你喜欢
            • 2013-03-13
            • 2011-07-03
            • 2012-10-09
            • 1970-01-01
            • 1970-01-01
            • 2017-01-23
            • 1970-01-01
            • 1970-01-01
            • 2022-12-10
            相关资源
            最近更新 更多