PHP的超时实现

我们知道PHP可以设置一个脚本执行的超时时间, 也就是脚本的执行时间不能超过设置的超时时间.
那么PHP是怎么做到这个功能的呢?

    其实PHP的超时功能利用了操作系统的定时信号来实现的, 在一个请求开始时(php_request_startup),
PHP便会利用zend_set_timeout()接口来设置一个定时器信号, zend_set_timeout()的实现如下:

1void zend_set_timeout(long seconds) 2{ 3 ...... 4 setitimer(ITIMER_REAL, &t_r, NULL); 5 signal(SIGALRM, zend_timeout); 6 sigemptyset(&sigset); 7 sigaddset(&sigset, SIGALRM); 8 ...... 9}

    可以看出, zend_set_timeout()主要是调用了操作系统的setitimer()接口来设置定时器信号, 
然后使用signal()接口来设置定时器信号的处理回调函数为zend_timeout().
    而在php_request_startup()函数中可以看到以下的调用:

1int php_request_startup(TSRMLS_D) 2{ 3 ...... 4 zend_set_timeout(EG(timeout_seconds)); 5 ...... 6}

    当一个客户端请求到达的时候, PHP便会调用php_request_startup()函数, 而php_request_startup()
函数就会调用zend_set_timeout()来设置定时器信号, 当定时器信号触发的时候, 便会调用zend_timeout()
函数, zend_timeout()函数如下:

1ZEND_API void zend_timeout(int dummy) 2{ 3 ...... 4 zend_error(E_ERROR, "Maximum execution time of %d second%s exceeded", 5 EG(timeout_seconds), EG(timeout_seconds) == 1 ? "" : "s"); 6 ...... 7}

    可以看出, zend_timeout()函数主要就是调用zend_error()函数, 而zend_error()函数的作用主要是

输出超时提示和结束请求, 也就是类似于echo加exit一样.

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

NGINX 502 BAD GATEWAY的解决办法

出现502badgateway错误的原因1.phpfpm进程数不够用2.Linux内核打开文件数量小3.脚本执行时间超时4.缓存设置比较小网站间歇性出现502,第一反应不是程序的问题,而是nginx服务器的问题,因为这是代理服务器出现的问题,代理服务器并没有安装php排除第一中情况。于此想到的是可能是超时,所以我把超时修

PHP导入导出EXCELl,CSV

PHP导入导出Excel,CSVHTML<formaction"{:U('Admin/Unit/importcsv')}"method"post"name"myform"id"myform"enctype"multipart/formdata"<input

Mac11.0.1 phpize失效问题

升级Mac至11.0.1后执行phpize报以下问题grep:/usr/include/php/main/php.h:Nosuchfileordirectorygrep:/usr/include/php/Zend/zend_modules.h:Nosuchfile

PHP的超时实现 - HelloWorld