博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP的超时实现
阅读量:6902 次
发布时间:2019-06-27

本文共 1113 字,大约阅读时间需要 3 分钟。

hot3.png

    我们知道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一样.

转载于:https://my.oschina.net/liexusong/blog/118494

你可能感兴趣的文章
判断客户端浏览器是否安装了Flash插件的多种方法
查看>>
安卓开发入门-与java关系
查看>>
使用Jmeter3.3测试presto数据库
查看>>
我的友情链接
查看>>
一个简单CMS系统的粗略表结构记录——持续更新
查看>>
枚举类型排序
查看>>
敏捷开发流程管理须参考的3个要素
查看>>
软考上午题难点5分钟攻克系列(十二)
查看>>
Excel中 随机抽取n行 存储在access中
查看>>
ansible playbook显示自定义shell参数
查看>>
Java基础学习总结(14)——Java对象的序列化和反序列化
查看>>
Java基础学习总结(6)——面向对象
查看>>
RIP协议之高级篇
查看>>
Maven学习总结(三)——使用Maven构建项目
查看>>
Java基础学习总结(6)——面向对象
查看>>
Python ***没有开启静态化的 WordPress 站
查看>>
Linux RedHat的安装
查看>>
Docker高手十一法则
查看>>
iOS7之定制View Controller切换效果
查看>>
[Codeforces1148C]Crazy Diamond——构造
查看>>