为什么php使用ITIMER_PROF而不是setitimer中的ITIMER_REAL?

时间:2014-02-17 18:49:34

标签: php linux setitimer

Linux下的PHP通过在setitimer中使用ITIMER_PROF来实现ini(max_execution_time)和set_time_limit,但不是ITIMER_REAL。 通过谷歌它,我在php.net中发现了一个关于这个问题https://bugs.php.net/bug.php?id=65596的线程。与PHP手册http://php.net/manual/en/function.set-time-limit.php注意

相关
  

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

我想知道为什么PHP超时机制设计的方式,如果我在Zend / zend_execute_API.c中将ITIMER_PROF更改为ITIMER_REAL,会显示什么副作用?

1 个答案:

答案 0 :(得分:1)

他们这样做是为了便携。

由于ITIMER_REAL发送ITIMER_REAL信号而不是SIGALRMSIGVALRM信号,

SIGPROF打破了某些SAPI和unices。

副作用我认为会过早终止脚本并与某些SAPI不兼容,例如Apache + mod_php。

一些unices也在睡眠时使用SIGALRM(2)php的sleep()函数使用,这将是另一个副作用。