"真正的"执行时间限制

Fro*_*y Z 12 php execution-time

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

注意:

set_time_limit()函数的功能和配置指令 的max_execution_time只影响脚本本身的执行时间.在确定脚本运行的最长时间时,不会包括在执行脚本之外发生的任何活动,例如使用system()的系统调用,流操作,数据库查询等.在测量时间真实的Windows上,情况并非如此.

在PHP评论中提出了一个解决方案,它具有像我正在寻找的"实际"执行时间限制,但我发现它不清楚/令人困惑.

小智 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); 
}
Run Code Online (Sandbox Code Playgroud)

我希望我已经解释得很好了。如果您对此解决方案仍有疑问,请告诉我。