Home >Backend Development >PHP Tutorial >PHP内核两大流程之请求处理

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

WBOY
WBOYOriginal
2016-06-23 13:45:56877browse

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 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");      }  

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn