Home >Backend Development >PHP Tutorial >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 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"); }