12

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

笔记:

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

PHP 注释中提出了一个解决方案,以像我正在寻找的那样具有“真正的”执行时间限制,但我发现它不清楚/令人困惑。

4

1 回答 1

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); 
}

我希望我已经解释清楚了。如果您对此解决方案有任何疑问,请告诉我。

于 2011-10-04T23:14:14.807 回答