使用set_time_limit()或 max_execution_time ,并非“真正”限制(在Windows上除外)执行时间,因为如PHP手册中所述:
注意:
set_time_limit()函数和配置指令 max_execution_time 仅影响脚本的执行时间 本身。花在执行之外的活动上的任何时间 使用 system()进行系统调用的脚本,流操作, 确定最大值时不包括数据库查询等 脚本运行的时间。在Windows上不是这样 测量时间是真实的。
解决方案proposed in PHP comments具有“真正的”执行时间限制,就像我正在寻找的那样,但我发现它不清楚/令人困惑。
答案 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);
}
我希望我已经好好推出了它。如果您对这个解决方案有疑问,请告诉我。