1

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,会显示什么副作用?

4

1 回答 1

2

他们这样做是为了便携。

ITIMER_REALITIMER_REAL由于发送SIGALRM信号而不是SIGVALRM或信号而在某些 SAPI 和 unice 上中断SIGPROF

我认为副作用是脚本过早终止以及与某些 SAPI(例如 Apache + mod_php)不兼容。

一些 unices 还在 sleep(2) 上使用 SIGALRM,这是 php 的 sleep() 函数使用的,所以这将是另一个副作用。

于 2014-08-16T11:05:02.623 回答