PHP内核两大流程之请求处理

static int php_handler(request_rec *r)
{
	/* Initiliaze the context */
        php_struct * volatile ctx;
        void *conf;
        apr_bucket_brigade * volatile brigade;
        apr_bucket *bucket;
        apr_status_t rv;
        request_rec * volatile parent_req = NULL;
        TSRMLS_FETCH();

	......

        zend_file_handle zfd;

        zfd.type = ZEND_HANDLE_FILENAME;
        zfd.filename = (char *) r->filename;
        zfd.free_filename = 0;
        zfd.opened_path = NULL;

	zend_execute_scripts(ZEND_INCLUDE TSRMLS_CC, NULL, 1, &zfd);

	......
}

ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_count, ...) /* {{{ */
{
	......

	EG(active_op_array) = 	zend_compile_file(file_handle, type TSRMLS_CC);

	......

	zend_execute(EG(active_op_array) TSRMLS_CC);

	......
}

    ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)
    {
        // 鍒濆鍖栨墽琛屼笂涓嬫枃
        zend_execute_data execute_data;  

        // 濡傛灉鏈夊紓甯稿氨閫€鍑烘墽琛?
        if (EG(exception)) {
            return;
        }  

        /* Initialize execute_data */
        EX(fbc) = NULL; // 鍒濆鍖栨鍦ㄨ皟鐢ㄧ殑鍑芥暟
        EX(object) = NULL; // 鍒濆鍖栨鍦ㄨ皟鐢ㄧ殑瀵硅薄
        EX(old_error_reporting) = NULL; // 鍒濆鍖栭敊璇姤鍛婂彉閲? 

        // 涓烘墽琛屾爤鍒嗛厤绌洪棿
        if (op_array->T < TEMP_VAR_STACK_LIMIT) {
            EX(Ts) = (temp_variable *) do_alloca(sizeof(temp_variable) * op_array->T);
        } else {
            EX(Ts) = (temp_variable *) safe_emalloc(sizeof(temp_variable), op_array->T, 0);
        }
        // 涓轰复鏃跺彉閲忓垎閰嶇┖闂村苟鍒濆鍖栬繖浜涚┖闂?
        EX(CVs) = (zval***)do_alloca(sizeof(zval**) * op_array->last_var);
        memset(EX(CVs), 0, sizeof(zval**) * op_array->last_var);  

        EX(op_array) = op_array;  

        // 鍒囨崲鎵ц涓婁笅鏂?
        EX(original_in_execution) = EG(in_execution);
        EX(symbol_table) = EG(active_symbol_table);
        EX(prev_execute_data) = EG(current_execute_data); // 灏嗗綋鍓嶅叏灞€鍙橀噺涓殑鎵ц鏁版嵁鍘嬫爤
        EG(current_execute_data) = &execute_data; // 灏嗗綋鍓嶆墽琛屼笂涓嬫枃鍘嬫爤  

        EG(in_execution) = 1;
        // 鍒濆鍖栫涓€涓寚浠?opcode)
        /*
        #define ZEND_VM_SET_OPCODE(new_op) \
        CHECK_SYMBOL_TABLES() \
        EX(opline) = new_op 

        execute_data.opline 涓哄綋鍓嶆墽琛岀殑 opcode
        */
        if (op_array->start_op) {
            ZEND_VM_SET_OPCODE(op_array->start_op);
        } else {
            ZEND_VM_SET_OPCODE(op_array->opcodes);
        }  

        if (op_array->uses_this && EG(This)) {
            EG(This)->refcount++; /* For $this pointer */
            if (zend_hash_add(EG(active_symbol_table), "this", sizeof("this"), &EG(This), sizeof(zval *), NULL)==FAILURE) {
                EG(This)->refcount--;
            }
        }  

        // 灏嗗瓨鍌╫pline鐨勫唴瀛樺湴鍧€璧嬬粰 executor_globals.online_ptr 锛屽彲浠ュ疄鏃惰窡韪猳pcode鐨勬墽琛?
        EG(opline_ptr) = &EX(opline);  

        EX(function_state).function = (zend_function *) op_array;
        EG(function_state_ptr) = &EX(function_state);
    #if ZEND_DEBUG
        /* function_state.function_symbol_table is saved as-is to a stack,
         * which is an intentional UMR.  Shut it up if we're in DEBUG.
         */
        EX(function_state).function_symbol_table = NULL;
    #endif  

        while (1) {
    #ifdef ZEND_WIN32
            if (EG(timed_out)) {
                zend_timeout(0);
            }
    #endif  

            // 寰幆璋冪敤姣忎釜opline鐨?handler 鍑芥暟锛屽鏋滄槸鎺ㄥ嚭鍑芥暟鐨勮瘽锛岃繑鍥炲€煎ぇ浜?锛屽氨閫€鍑?
            if (EX(opline)->handler(&execute_data TSRMLS_CC) > 0) {
          return;
            }  

        }
        zend_error_noreturn(E_ERROR, "Arrived at end of main loop which shouldn't happen");
    }  

时间: 2024-10-29 10:47:46

PHP内核两大流程之请求处理的相关文章

PHP内核两大流程之启动PHP的核心代码段

Step 1: Start the sapi extern zend_module_entry php_apache_module; static int php_apache2_startup(sapi_module_struct *sapi_module) { if (php_module_startup(sapi_module, &php_apache_module, 1)==FAILURE) { return FAILURE; } return SUCCESS; } Step 2: St

SQL/NoSQL两大阵营激辩:谁更适合大数据

企业在着手推动大数据项目的过程中,经常会遇到这样一个关键性的决策难题--到底该使用哪种数据库方案?经过综合考量,最终的选项往往只剩下 SQL 与 NoSQL 两种.SQL 具有骄人的业绩以及庞大的安装基础,但 NoSQL 却能够带来可观的收益并同样拥有不少支持者.在今天的辩论当中,我们将一同听听两大阵营中各位专家的意见. Network World 网站主编 John Dix 专门组织了此次辩论并邀请到多位专家.其中两位参与专家分别是 VoltDB 公司 CTO Ryan Betts 和 Cou

debian内核代码执行流程(一)

本文根据debian开机信息来查看内核源代码. 系统使用<debian下配置dynamic printk以及重新编译内核>中内核源码来查看执行流程. 使用dmesg命令,得到下面的开机信息: [ 0.000000] Initializing cgroup subsys cpuset [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Linux version 3.2.57 ([email protected]) (gcc versio

计算机的操作系统与IT技术的两大领域

计算机的操作系统 起初在还没有计算机的时候冯诺依曼在1946年就提出计算机的5大部件别是"运算器,控制器,存储器,输入设备,输出设备"直到现在还并没有被打破,随后计算机出现了,成功的按照了冯诺依曼的预言.计算机并没有脱离他提出的5大部件冯诺依曼还提出来计算机需要用二进制语言,随后也应验了二进制语言,计算机的语言分别有:二进制语言,微码语言(微码语言转换成二进制计算机才能执行),高级系统级语言(分别是C,java等等),高级应用级语言(php,python,perl,ruby,lua)计

两大数据库缓存系统实现对比

和redis,作为近些年最常用的缓存服务器,相信大家对它们再熟悉不过了.前两年还在学校时,我曾经读过它们的主要源码,如今写篇笔记从个人角度简单对比一下它们的实现方式,权当做复习,有理解错误之处,欢迎指正. 两大数据库缓存系统实现对比两大数据库缓存系统实现对比一. 综述读一个软件的源码,首先要弄懂软件是用作干什么的,那memcached和redis是干啥的?众所周知,数据一般会放在数据库中,但是查询数据会相对比较慢,特别是用户很多时,频繁的查询,需要耗费大量的时间.怎么办呢?数据放在哪里查询快?那

hadoop两大核心之一:MapReduce总结

MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,MapReduce程序 本质上是并行运行的,因此可以解决海量数据的计算问题. MapReduce任务过程被分为两个处理阶段:map阶段和reduce阶段.每个阶段都以键 值对作为输入和输出.用户只需要实现map()和reduce()两个函数即可实现分布式计算. 执行步骤: map任务处理: 1.读取输入文件内容,解析成键值对(key/value).对输入文件的每一行,解析成 键值对(key/value).每一个键值对调

谈谈云计算两大初创企业docker和CoreOS

谈谈云计算两大初创企业docker和CoreOS docker成立于2013年3月:https://www.docker.com/company/aboutus/ CoreOS成立于2013年8月:http://www.eweek.com/cloud/coreos-launches-managed-linux-operating-system-as-a-service.html 最近CoreOS正在建立一种容器运行时Rocket:https://coreos.com/blog/rocket/ 文

OA办公平台两大挑战:移动端和社交网络软件

随着互联网普及和社交网络软件的普及,OA办公平台已明显展示出它的弱势.一方面,移动办公被年轻化企事业单位逐渐接受,移动OA正逐步推出并升级,以适应越来越多的企业需求者,另一方面,企业社交软件普及,公司内部资料沟通和共享的渠道越来越多,也越来越大,价格居高不下的OA办公平台逐渐被打压.不少OA厂家已经意识到,类似OA办公平台的企业管理软件,需满足的功能需求越来越多,但是OA现有发展模式单一,开发周期长,市场已趋于成熟.而从OA办公平台的市场需求来看,很多企事业单位虽然也希望提高员工办公效率,但是他

站在淘宝天猫两大平台背后的平台

一.供销平台,站在淘宝与天猫背后的平台 1.域名:http://gongxiao.tmall.com(1)以前还用过fenxiao.tmall.com等域名,后来想清楚为了哪个渠道服务,直接用上边的域名作为几大交易市场的供应商服务平台 2.供销授权的商品展现(1)供应商商品能够通过平台授权给分销商(代销.经销)在淘宝.天猫销售.(2)供应商能够在这个功效平台展现自己的商品.同一时候招募分销商. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/