【问题标题】:limit execution time of shell_exec限制 shell_exec 的执行时间
【发布时间】:2012-05-04 17:54:22
【问题描述】:

我有一个 exe 文件,其代码如下:

while(1)

printf("hello\n");

我正在使用 shell_exec 通过 php 执行这个 exe

$output = shell_exec('C:/Users/thekosmix/Desktop/hello.exe 2>&1');

回显 $output;

现在脚本执行了很长时间,直到我从任务管理器中终止进程并给出致命错误:

(致命错误:第 7 行 C:\xampp\htdocs\shell\index.php 中允许的内存大小为 134217728 字节已用尽(尝试分配 133693440 字节))

我希望脚本(或此函数)在给定的持续时间内运行并打印在该持续时间内生成的任何输出,而不是任何致命错误。 set_time_limit() 也没有解决问题。

【问题讨论】:

    标签: php fatal-error shell-exec


    【解决方案1】:

    总结一下:如果您使用 Linux 服务器,请执行以下操作:

    shell_exec('ulimit -t 120 && ' . $path_to_program);
    

    这会在 cpu 使用两分钟后终止,这远远超过 2 分钟的实时时间,具体取决于程序的资源需求。

    【讨论】:

      【解决方案2】:

      您不能在 PHP 中执行此操作 - set_time_limit() 仅在每个 PHP 语句执行后检查。在 linux 下你会使用ulimit,但看起来你使用的是 Windows。

      您需要修改hello.exe 可执行文件以构建超时,或者编写一个从PHP 调用的包装器,它调用hello.exe 并处理超时。在任何可以轻松分叉的语言中,这都是微不足道的。

      【讨论】:

      • 使用 ulimit,我该如何解决我的问题?我是 linux 新手...所以不知道如何使用 ulimit...!
      • ulimit -t 3 将当前进程设置为仅允许 3 秒的 CPU 时间。达到此时间限制时,该进程将被终止。请记住,这是 CPU 时间,而不是实时时间。
      • 你的意思是我可以做到这一点.. shell_exec('ulimt -t 3'); shell_exec($path_to_program);
      • 你能告诉我如何使用php在linux的shell_exec中设置时间限制
      【解决方案3】:

      你可以这样修改脚本

      while (shouldKeepRunning())
      

      shouldKeepRunning 可以以最原始的形式检查某个文件是否存在以确定它是否应该继续运行。然后,您只需创建或删除一个文件即可正常关​​闭脚本。在 linux 上,您可以为此使用信号处理程序,但不能使用 windows。无论如何,你明白了。

      如果没有大量代码修改,外部 while 循环不够精细,您可以使用记号。 http://php.net/manual/en/control-structures.declare.php

      【讨论】:

        猜你喜欢
        • 2014-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-26
        • 2019-07-02
        • 2018-08-26
        • 1970-01-01
        • 2018-04-23
        相关资源
        最近更新 更多