“真实”执行时间限制
Posted
技术标签:
【中文标题】“真实”执行时间限制【英文标题】:"real" execution time limit 【发布时间】:2011-11-26 01:00:30 【问题描述】:使用set_time_limit() 或max_execution_time,不会“真正”限制(Windows 除外)执行时间,因为如 php 手册所述:
注意:
set_time_limit() 函数和配置指令 max_execution_time 只影响脚本的执行时间 本身。在执行之外发生的活动上花费的任何时间 诸如使用 system() 的系统调用、流操作、 确定最大值时不包括数据库查询等 脚本运行的时间。在 Windows 上不是这样 其中测量的时间是真实的。
一个解决方案是proposed in PHP comments 有一个“真正的”执行时间限制,就像我正在寻找的那样,但我发现它不清楚/令人困惑。
【问题讨论】:
真正的执行时间限制由执行进程的系统设置。如果达到限制(也称为硬限制),它可以终止进程。这是一个真正的限制,通常基于 CPU 时间,即进程实际消耗的时间(不完全是进程已经运行了多长时间)。 the comment you are talking about 中建议的解决方案对我来说看起来不错 - 只要您有可用的 POSIX 和 pcntl 函数。你到底有什么不明白的? 更彻底地查看 PHP 手册 cmets 中的建议很有帮助 :) 起初我不明白它是如何工作的(我不习惯线程处理)。 如果您需要控制一些基于循环的过程,您可以使用简单的计时器。 你可以非常接近使用tick函数来实现它,但它会是一个hack。 php.net/manual/en/function.register-tick-function.php 【参考方案1】:我可能错了,但据我了解,您要求解释“PHP cmets”解决方案代码。
诀窍是使用 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);
我希望我已经解释清楚了。如果您对此解决方案有任何疑问,请告诉我。
【讨论】:
以上是关于“真实”执行时间限制的主要内容,如果未能解决你的问题,请参考以下文章