代码之家  ›  专栏  ›  技术社区  ›  robjmills

Shell命令在命令行上工作,但在PHP exec中不工作

  •  1
  • robjmills  · 技术社区  · 14 年前

    最长执行时间为30秒 超过

    命令本身的名称如下-

    从命令行作为:

    root@server>php -q /path/to/file.php
    

    通过PHP文件中的cron:

    exec("php -q /path/to/file.php");
    

    这将抛出max execution time错误。我一直认为,从命令行运行PHP时没有执行时间限制。

    我应该指出,被调用的脚本调用了许多其他脚本,而这些脚本中的一个是错误的。查看我的日志,最大执行时间错误实际上也发生在30秒之前!因此,在被调用后不到30秒,一个由cron脚本调用的脚本抛出了一个max execution错误。

    为了检查脚本是否按预期运行(作为没有最长执行时间的CLI),我执行了以下检查:

    包含以下代码的PHP脚本:

    // test.php
    echo exec("php test2.php");
    

    echo ini_get('max_execution_time');
    

    这个脚本是这样运行的:

    root@server> php test.php
    // returns 0
    

    这证明了一个以这种方式调用的脚本在CLI下运行,最大执行时间为0,这正好证明了我的想法,我真的不明白为什么这个脚本在最大执行时间上失败了!

    7 回复  |  直到 14 年前
        1
  •  1
  •   Community CDub    8 年前

    看来你的脚本执行起来太费时了,试试看吧

    http://php.net/manual/en/function.set-time-limit.php

    或查看此帖子: Asynchronous shell exec in PHP

        2
  •  1
  •   Joshua D. Drake    14 年前

        3
  •  1
  •   Buggabill    14 年前

    您可以通过在脚本的顶部包含这个来临时设置超时。在安全模式下运行时,这将不起作用,如文档中指定的设置 max_execution_time 具有 ini_set() .

    <?php
        ini_set('max_execution_time', 60);  // Set to be longer than 
                                            // 60 seconds if needed
    
        // Rest of script...
    ?>
    

    默认设置为0。

        4
  •  1
  •   Jhong    14 年前

    是什么 php -v | grep cli ,从shell和从cron加载的php文件show的exec命令中运行?

    是否明确键入 /usr/bin/php (酌情修改)有什么区别吗?

        5
  •  1
  •   robjmills    14 年前

    max_execution_time 当错误实际发生在 max_input_time as described here

    我试着把主管电话改成 php -d max_execution_time=0 -q /path/to/file.php 我得到了错误“超过0秒的最大执行时间”,这没有意义,我把代码改为 php -d max_input_time=0 -q /path/to/file.php 代码运行正常。不幸的是,10分钟后它仍在运行。至少这证明了问题在于

        6
  •  0
  •   user2684428    11 年前

    完整的 行政电话。问题是exec(x)比命令行x花费的时间要长得多。我有一个非常复杂的perl脚本(具有8级内部递归),从命令行执行大约需要40秒。在php脚本中使用exec调用同一个perl程序大约需要300秒来执行,也就是说,执行时间要长7倍。这是一个如此出人意料的结果,以至于人们没有足够地增加他们的最大执行时间来看到他们的程序完成。结果,他们被超时搞糊涂了(顺便说一句,我在一台名为8个cpu的快速机器上运行WAMP,而我的php程序的其余部分基本上是微不足道的,因此时差必须完全在exec中。)

        7
  •  0
  •   Community CDub    4 年前

    export DISPLAY=:0<br>
    xhost + 2>>/var/www/err.log<br>
    /usr/bin/php "/var/www/read_sms1.php" 2>>/var/www/err.log<br>
    


     bash  /var/www/wrapper.sh<br>
    y read_sms1.php  contain<br>
    $ping_ex = exec("/usr/local/bin/gnokii --getsms SM 1 end  ", $exec_result, $pr);  
    

    上面的解决方案对我来说很好 ubuntu 12.04