如何检查PHP脚本到目前为止执行了多长时间。的max_execution_time?

时间:2013-07-12 14:31:17

标签: php

在max_execution_time的文档中,我们读到了

  

在确定脚本运行的最长时间时,不会包括在执行脚本之外发生的任何活动,例如使用system()的系统调用,流操作,数据库查询等。

如果这是真的,那么只需按Determine how long PHP executed so far中的建议使用microtime就不会给你任何关于你与最大执行时间限制有多接近的线索。

在某些环境/语言中存在“软”限制的概念 - 当它命中时,应用程序会得到通知,但不会终止,并且可以做出正确的反应。 在我看来,在PHP中你只有一个“硬”限制 - 你要么在截止日期之前,要么你用“超过%d秒%s的最大执行时间”E_ERROR撞墙,你什么都不能做约。

我想要做的是不时检查脚本执行的时间长度,并在接近最大执行时间时手动处理正常退出。

在类似问题Detect when running time is near max_execution_time的类似问题中,接受的解决方案是注册一个关闭功能 - 这有点回避了原来的问题,并没有真正适用于我的情况 - 我想处理应用程序上下文中的问题,而不是关闭处理程序中的问题。

根据我的理解Zend / zend_execute_API.c,zend_set_timeout函数使用                 struct itimerval t_r; / *请求超时* /                 sigset_t sigset;

            if(seconds) {
                    t_r.it_value.tv_sec = seconds;
                    t_r.it_value.tv_usec = t_r.it_interval.tv_sec = t_r.it_interval.tv_usec = 0;
                    setitimer(ITIMER_PROF, &t_r, NULL);
            }
            if(reset_signals) {
                    signal(SIGPROF, zend_timeout);
                    sigemptyset(&sigset);
                    sigaddset(&sigset, SIGPROF);
            }

根据我的理解http://linux.die.net/man/2/setitimer,这应该同时衡量:用户和系统模式时间。我在这里感到困惑,因为它与PHP规范有些矛盾。 在setitimer的注释中,可以读到

  

POSIX.1离开setitimer()和三者之间的交互   接口alarm(2),sleep(3)和usleep(3)未指定。

这可以解释为什么以下脚本在5(挂钟)秒后不会退出:

<?php
set_time_limit(5);
while(1){sleep(1);}
?>

可能睡眠不计入用户时间或系统时间。

0 个答案:

没有答案