为了账号安全,请及时绑定邮箱和手机立即绑定

跟厂长学PHP7内核(六):生命周期之请求初始化阶段

标签:
PHP

上篇文章我们分析了生命周期的模块初始化阶段,大部分是初始化全局变量和各种宏的定义,今天我们来学习一下五大生命周期的第二阶段--请求初始化阶段(php_request_startup)。

一、概览

我们先对请求初始化阶段内的函数做个概览。

函数说明
php_output_activate()重置输出全局变量,初始化输出相关堆栈
zend_activate()初始化Zend引擎
sapi_activate()初始化SG宏,调各sapi钩子函数activate
zend_signal_activate()信号处理
zend_set_timeout()设置超时时间
php_hash_environment()初始化PHP请求的全局变量
zend_activate_modules()调用各扩展定义的request_startup钩子函数

二、源码分析

2.1、php_output_activate

重新为output_globals分配内存,初始化与输出处理程序相关的堆栈,并将OG宏的flags设置为激活状态。

//main/output.cPHPAPI int php_output_activate(void){#ifdef ZTS
    memset((*((void ***) ZEND_TSRMLS_CACHE))[TSRM_UNSHUFFLE_RSRC_ID(output_globals_id)], 0, sizeof(zend_output_globals));#else
    memset(&output_globals, 0, sizeof(zend_output_globals));#endif

    zend_stack_init(&OG(handlers), sizeof(php_output_handler *));
    OG(flags) |= PHP_OUTPUT_ACTIVATED;    return SUCCESS;
}

2.2、zend_activate

zend引擎的初始化,主要作用为重置垃圾回收、初始化编译器、初始化执行器、初始化扫描器。

函数说明
gc_reset()重置垃圾回收
init_compiler()初始化编译器
init_executor()初始化执行器
startup_scanner()初始化扫描器

2.3、sapi_activate

对SG宏内的一些变量进行初始化,并调用当前sapi_module_struct中定义的钩子函数activate()以及input_filter_init(),但是在cli模式下,这两个钩子函数都没有实现,返回了null。

//main/SAPI.cSAPI_API void sapi_activate(void){
    zend_llist_init(&SG(sapi_headers).headers, sizeof(sapi_header_struct), (void (*)(void *)) sapi_free_header, 0);
    SG(sapi_headers).send_default_content_type = 1;    /*
    SG(sapi_headers).http_response_code = 200;
    */
    SG(sapi_headers).http_status_line = NULL;
    SG(sapi_headers).mimetype = NULL;
    SG(headers_sent) = 0;
    ZVAL_UNDEF(&SG(callback_func));
    SG(read_post_bytes) = 0;
    SG(request_info).request_body = NULL;
    ......
}

2.4、php_hash_environment

为http_globals分配内存,初始化auto_globals,解析请求参数并存放到全局变量中。

PHPAPI int php_hash_environment(void){    memset(PG(http_globals), 0, sizeof(PG(http_globals)));
    zend_activate_auto_globals();    if (PG(register_argc_argv)) {
        php_build_argv(SG(request_info).query_string, &PG(http_globals)[TRACK_VARS_SERVER]);
    }    return SUCCESS;
}

2.5、zend_activate_modules

该函数通过遍历注册在module_registry的所有模块,调用每个模块的钩子函数request_startup()进行初始化。

ZEND_API void zend_activate_modules(void) /* {{{ */{
    zend_module_entry **p = module_request_startup_handlers;    while (*p) {
        zend_module_entry *module = *p;        if (module->request_startup_func(module->type, module->module_number)==FAILURE) {
            zend_error(E_WARNING, "request_startup() for %s module failed", module->name);            exit(1);
        }
        p++;
    }
}

我执著于这样的细节,其实是执著于原味的生活,我固执地守候生活的起点,不管以后走多么远,那个起点其实也是我的终点。

原文出处:https://www.cnblogs.com/enochzzg/p/9581544.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消