“真正的”执行时间限制

时间:2011-09-27 13:02:26

标签: php execution-time

使用set_time_limit() max_execution_time ,并非“真正”限制(在Windows上除外)执行时间,因为如PHP手册中所述:

  

注意:

     

set_time_limit()函数和配置指令    max_execution_time 仅影响脚本的执行时间   本身。花在执行之外的活动上的任何时间   使用 system()进行系统调用的脚本,流操作,   确定最大值时不包括数据库查询等   脚本运行的时间。在Windows上不是这样   测量时间是真实的。

解决方案proposed in PHP comments具有“真正的”执行时间限制,就像我正在寻找的那样,但我发现它不清楚/令人困惑。

1 个答案:

答案 0 :(得分:3)

我可能错了,但据我所知,你要求解释“PHP评论”解决方案代码。

诀窍是使用 pcntl_fork 函数生成子进程,该函数将在超时后终止原始(父)进程。函数 pcntl_fork 返回父进程执行线程内新创建的子进程的进程ID,并返回子进程执行线程内的零。这意味着父进程将执行 if 语句下的代码,子进程将执行 else 下的代码。正如我们从代码中看到的那样,父进程将执行无限循环,而子进程将等待5秒然后杀死他的父进程。所以基本上你想做这样的事情:

$real_execution_time_limit = 60; // one minute

if (pcntl_fork())
{
    // some long time code which should be
    // terminated after $real_execution_time_limit seconds passed if it's not
    // finished by that time
}
else
{
    sleep($real_execution_time_limit);
    posix_kill(posix_getppid(), SIGKILL); 
}

我希望我已经好好推出了它。如果您对这个解决方案有疑问,请告诉我。