Heim  >  Artikel  >  Backend-Entwicklung  >  PHP内核两大流程之请求处理

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

WBOY
WBOYOriginal
2016-06-23 13:45:56842Durchsuche

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn