PHP的超时实现

Wesley13
• 阅读 840

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

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

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一样.

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
NGINX 502 BAD GATEWAY的解决办法
出现502badgateway错误的原因1.phpfpm进程数不够用2.Linux内核打开文件数量小3.脚本执行时间超时4.缓存设置比较小网站间歇性出现502,第一反应不是程序的问题,而是nginx服务器的问题,因为这是代理服务器出现的问题,代理服务器并没有安装php排除第一中情况。于此想到的是可能是超时,所以我把超时修
Stella981 Stella981
3年前
PHP导入导出EXCELl,CSV
PHP导入导出Excel,CSVHTML<formaction"{:U('Admin/Unit/importcsv')}"method"post"name"myform"id"myform"enctype"multipart/formdata"<input
Wesley13 Wesley13
3年前
PHP扩展开发(二)
上文我们学会了如何快速的进行一个PHP扩展的helloworld!下面我们将学习如何传递参数必要知识点1.变量存储结构(php5.6src/ZEND/zend.h)typedefunion_zvalue_value{longlval;//longvalue
Stella981 Stella981
3年前
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
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
PHP+jQuery寥寥几行代码轻松实现百度搜索那样的无刷新PJAX的分页列表和导航链接
!(https://static.oschina.net/uploads/space/2016/1208/171419_U00R_561214.png)PHP寥寥几行代码轻松实现百度搜索那样的分页列表和导航链接,某些语言的拥趸哭晕在厕所.<?php$apparray('db_prefix''
Wesley13 Wesley13
3年前
PHP中的NOW()函数
是否有一个PHP函数以与MySQL函数NOW()相同的格式返回日期和时间?我知道如何使用date()做到这一点,但是我问是否有一个仅用于此的函数。例如,返回:2009120100:00:001楼使用此功能:functiongetDatetimeNow(){