2011-09-27 81 views
11

使用set_time_limit()的max_execution_time,没有 “真正” 的限制(除了Windows)的执行时间,因为PHP手册中说:“真正” 的执行时间限制

注:

set_time_limit()函数和配置指令 max_execution_time只影响脚本 本身的执行时间。在确定脚本运行的最长时间为 时,不包括脚本执行 以外的任何活动时间,例如系统调用系统(),流操作, 数据库查询等。在测量时间是真实的Windows 上,这不是真的。

解决方案是proposed in PHP comments有一个“真正的”执行时间限制,就像我在找什么,但我发现它不清楚/混淆。

+2

真正的执行时间限制是由执行进程的系统设置的。如果达到限制(也称为硬限制),它可以终止进程。这是一个真正的限制,通常基于CPU时间,即一个进程所消耗的实际时间(不是该进程已经运行了多长时间)。 – hakre

+5

[你正在谈论的评论](http://www.php.net/manual/en/function.set-time-limit.php#105569)中提出的解决方案对我来说看起来不错 - 只要你有POSIX和pcntl函数可用。你究竟对此了解甚么? – DaveRandom

+0

仔细查看PHP手册中的建议有帮助:)我最初并不明白它是如何工作的(我不习惯线程处理)。 –

回答

3

我可能是错的,但据我了解,您要求解释“PHP注释”解决方案代码。

诀窍是产生一个子进程,使用pcntl_fork函数,它会在某个超时后终止原始(父)进程。函数pcntl_fork返回父进程执行线程内新创建子进程的进程ID,子进程执行线程内返回0。这意味着父进程将执行下的代码,如果语句和子进程将执行其他下的代码。正如我们从代码中可以看到的,父进程将执行无限循环,而子进程将等待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); 
} 

我希望我已经把它搞好了。让我知道你是否对此解决方案有疑问。

相关问题