void zend_set_timeout(long seconds){ ...... setitimer(ITIMER_REAL, &t_r, NULL); signal(SIGALRM, zend_timeout); sigemptyset(&sigset); sigaddset(&sigset, SIGALRM); ......}可以看出, zend_set_timeout()主要是调用了操作系统的setitimer()接口来设置定时器信号, 然后使用signal()接口来设置定时器信号的处理回调函数为zend_timeout(). 而在php_request_startup()函数中可以看到以下的调用:
int php_request_startup(TSRMLS_D){ ...... zend_set_timeout(EG(timeout_seconds)); ......}当一个客户端请求到达的时候, PHP便会调用php_request_startup()函数, 而php_request_startup() 函数就会调用zend_set_timeout()来设置定时器信号, 当定时器信号触发的时候, 便会调用zend_timeout() 函数, zend_timeout()函数如下:
ZEND_API void zend_timeout(int dummy){ ...... zend_error(E_ERROR, "Maximum execution time of %d second%s exceeded", EG(timeout_seconds), EG(timeout_seconds) == 1 ? "" : "s"); ......}可以看出, zend_timeout()函数主要就是调用zend_error()函数, 而zend_error()函数的作用主要是
输出超时提示和结束请求, 也就是类似于echo加exit一样.