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,会显示什么副作用?
答案 0 :(得分:1)
他们这样做是为了便携。
由于ITIMER_REAL
发送ITIMER_REAL
信号而不是SIGALRM
或SIGVALRM
信号, SIGPROF
打破了某些SAPI和unices。
副作用我认为会过早终止脚本并与某些SAPI不兼容,例如Apache + mod_php。
一些unices也在睡眠时使用SIGALRM(2)php的sleep()函数使用,这将是另一个副作用。