目錄
PHP内核两大流程之请求处理
首頁 後端開發 php教程 PHP内核两大流程之请求处理_PHP教程

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

Jul 13, 2016 am 10:13 AM
核心

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; // 初始化错误报告变量  
      
    // 为执行栈分配空间  
&#160; &#160; if (op_array->T < TEMP_VAR_STACK_LIMIT) { &#160;
&#160; &#160; &#160; &#160; EX(Ts) = (temp_variable *) do_alloca(sizeof(temp_variable) * op_array->T); &#160;
&#160; &#160; } else { &#160;
&#160; &#160; &#160; &#160; EX(Ts) = (temp_variable *) safe_emalloc(sizeof(temp_variable), op_array->T, 0); &#160;
&#160; &#160; } &#160;
&#160; &#160; // 为临时变量分配空间并初始化这些空间 &#160;
&#160; &#160; EX(CVs) = (zval***)do_alloca(sizeof(zval**) * op_array->last_var); &#160;
&#160; &#160; memset(EX(CVs), 0, sizeof(zval**) * op_array->last_var); &#160;
&#160; &#160; &#160;&#160;
&#160; &#160; EX(op_array) = op_array; &#160;
&#160; &#160; &#160;&#160;
&#160; &#160; // 切换执行上下文 &#160;
&#160; &#160; EX(original_in_execution) = EG(in_execution); &#160;
&#160; &#160; EX(symbol_table) = EG(active_symbol_table); &#160;
&#160; &#160; EX(prev_execute_data) = EG(current_execute_data); // 将当前全局变量中的执行数据压栈 &#160;
&#160; &#160; EG(current_execute_data) = &execute_data; // 将当前执行上下文压栈 &#160;
&#160;&#160;
&#160; &#160; EG(in_execution) = 1; &#160;
&#160; &#160; // 初始化第一个指令(opcode) &#160;
&#160; &#160; /*&#160;
&#160; &#160; #define ZEND_VM_SET_OPCODE(new_op) \&#160;
&#160; &#160; CHECK_SYMBOL_TABLES() \&#160;
&#160; &#160; EX(opline) = new_op&#160;
&#160; &#160; &#160;
&#160; &#160; execute_data.opline 为当前执行的 opcode&#160;
&#160; &#160; */ &#160;
&#160; &#160; if (op_array->start_op) { &#160;
&#160; &#160; &#160; &#160; ZEND_VM_SET_OPCODE(op_array->start_op); &#160;
&#160; &#160; } else { &#160;
&#160; &#160; &#160; &#160; ZEND_VM_SET_OPCODE(op_array->opcodes); &#160;
&#160; &#160; } &#160;
&#160;&#160;
&#160; &#160; if (op_array->uses_this && EG(This)) { &#160;
&#160; &#160; &#160; &#160; EG(This)->refcount++; /* For $this pointer */ &#160;
&#160; &#160; &#160; &#160; if (zend_hash_add(EG(active_symbol_table), "this", sizeof("this"), &EG(This), sizeof(zval *), NULL)==FAILURE) { &#160;
&#160; &#160; &#160; &#160; &#160; &#160; EG(This)->refcount--; &#160;
&#160; &#160; &#160; &#160; } &#160;
&#160; &#160; } &#160;
&#160;&#160;
&#160; &#160; // 将存储opline的内存地址赋给 executor_globals.online_ptr ,可以实时跟踪opcode的执行 &#160;
&#160; &#160; EG(opline_ptr) = &EX(opline); &#160;
&#160;&#160;
&#160; &#160; EX(function_state).function = (zend_function *) op_array; &#160;
&#160; &#160; EG(function_state_ptr) = &EX(function_state); &#160;
#if ZEND_DEBUG &#160;
&#160; &#160; /* function_state.function_symbol_table is saved as-is to a stack,&#160;
&#160; &#160; &#160;* which is an intentional UMR. &#160;Shut it up if we&#39;re in DEBUG.&#160;
&#160; &#160; &#160;*/ &#160;
&#160; &#160; EX(function_state).function_symbol_table = NULL; &#160;
#endif &#160;
&#160; &#160; &#160;&#160;
&#160; &#160; while (1) { &#160;
#ifdef ZEND_WIN32 &#160;
&#160; &#160; &#160; &#160; if (EG(timed_out)) { &#160;
&#160; &#160; &#160; &#160; &#160; &#160; zend_timeout(0); &#160;
&#160; &#160; &#160; &#160; } &#160;
#endif &#160;
&#160; &#160; &#160; &#160; &#160;&#160;
&#160; &#160; &#160; &#160; // 循环调用每个opline的 handler 函数,如果是推出函数的话,返回值大于0,就退出 &#160;
&#160; &#160; &#160; &#160; if (EX(opline)->handler(&execute_data TSRMLS_CC) > 0) { &#160;
&#160; &#160; &#160; return; &#160;
&#160; &#160; &#160; &#160; } &#160;
&#160;&#160;
&#160; &#160; } &#160;
&#160; &#160; zend_error_noreturn(E_ERROR, "Arrived at end of main loop which shouldn&#39;t happen"); &#160;
} &#160;
登入後複製

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/914780.htmlTechArticlePHP内核两大流程之请求处理 static int php_handler(request_rec *r){/* Initiliaze the context */ php_struct * volatile ctx; void *conf; apr_bucket_brigade * volatile brigad...
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1670
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1274
29
C# 教程
1256
24
如何在Ubuntu 22.04上安裝Linux 核心 詳細教學! 如何在Ubuntu 22.04上安裝Linux 核心 詳細教學! Mar 01, 2024 pm 10:34 PM

在Ubuntu22.04上安裝Linux核心可以按照以下步驟進行操作:更新系統:首先,確保你的Ubuntu系統是最新的,執行以下命令更新系統軟體包:sudoaptupdatesudoaptupgrade下載核心檔案:訪問Linux核心官方網站()下載所需的核心版本。選擇一個穩定版本並下載原始碼檔案(以.tar.gz或.tar.xz為副檔名),例如:wget解壓縮檔:使用下列指令解壓縮下載的核心原始碼檔案:tar-xflinux-5.14.tar. xz安裝建置依賴:安裝建置核心所需的工具和相依性。執

Linux修改核心(kernel)啟動順序 Linux修改核心(kernel)啟動順序 Feb 23, 2024 pm 10:22 PM

Linux修改核心(kernel)啟動順序一、RHEL6/CentOS6修改核心啟動順序檢視/etc/grub.conf檔案以決定係統核心狀況。根據檔案顯示,系統有兩個核心版本,分別為2.6.32-573.18.1.el6.x86_64和2.6.32-431.23.3.el6.x86_64。核心版本從上到下列出。在grub.conf檔案中,可以透過調整default參數來決定係統啟動時使用哪個核心版本。預設值為0,表示系統將啟動最新的核心版本。值為0對應grub.conf檔案中列出的第一個內

安卓系統究竟是不是基於Linux核心? 安卓系統究竟是不是基於Linux核心? Mar 14, 2024 pm 03:12 PM

安卓系統究竟是不是基於Linux核心?安卓系統作為目前全球使用最廣泛的行動作業系統之一,一直被稱為基於Linux核心開發的。然而,真正的情況究竟如何呢?讓我們來探討一下這個問題。首先,讓我們來了解Linux核心。 Linux內核作為一個開源的作業系統內核,是由LinusTorvalds於1991年首次發布的。它為許多作業系統提供了良好的基礎,包括And

Linux核心主函數解析與分析 Linux核心主函數解析與分析 Mar 14, 2024 am 11:27 AM

Linux核心主函數解析與分析Linux核心是一個龐大而複雜的系統,其中的主函數起著至關重要的作用,它是整個系統的入口點,負責初始化各種子系統、驅動程式和核心模組,最終啟動整個作業系統。本文將針對Linux核心主函數進行解析與分析,透過具體的程式碼範例來展示其關鍵功能和執行流程。在Linux核心中,主函數的入口點位於init/main.c檔案中的start_k

探究 Linux 核心底層所使用的程式語言 探究 Linux 核心底層所使用的程式語言 Mar 20, 2024 am 08:06 AM

標題:探究Linux核心底層所使用的程式語言Linux核心作為一個開源、穩定、可靠的作業系統內核,在電腦領域有廣泛的應用。而要深入了解Linux內核,就不得不涉及其底層所使用的程式語言。事實上,Linux核心主要是用C語言編寫的,這是一個高效、靈活且易於維護的程式語言,非常適合用於作業系統的開發。本文將從細節的角度探討Linux內核底

Linux核心原始碼存放位置詳解 Linux核心原始碼存放位置詳解 Mar 14, 2024 pm 06:12 PM

Linux核心原始碼存放位置詳解Linux核心原始碼是Linux作業系統的核心部分,它包含了作業系統的各種功能的實作程式碼。要了解Linux核心原始碼的存放位置,我們首先需要了解Linux核心的組織結構。 Linux核心原始碼通常存放在/usr/src/linux或/usr/src/linux-目錄下。在這個目錄中,包含了豐

win10比win7效能有提升嗎詳細介紹 win10比win7效能有提升嗎詳細介紹 Dec 23, 2023 am 09:04 AM

現在比較受歡迎的系統是win10系統了,當然也有正在準備升級的用戶,這些用戶最關心的就是win10比win7效能有提升嗎?其實整體來說還是有一些些提升的,相容性也不錯哦。 win10比win7性能有提升嗎:答:win10比win7性能是有提升的。整體的提升並不是很大,因為性能主要和硬體掛鉤。但是win10系統進行了很多的優化因此可以更好的輔助。而且微軟已經不支援win7的更新了,因此win10將會是後期最常見的系統。 win10比win7對比特色:1、配置:win7已經推出了十幾年的時間了,經過了很多

Debian安裝核心及Debian安裝核心開頭頭文件 Debian安裝核心及Debian安裝核心開頭頭文件 Feb 14, 2024 pm 01:24 PM

前言LINUX,這個開源的作業系統,一直以來都在為全球的開發者提供穩定而強大的環境,不論是伺服器,還是嵌入式設備,甚至是超級計算機,Linux都發揮著關鍵的作用,為了滿足不同的需求,我們常常需要對Linux核心進行客製化與安裝,我們就以Debian系統為例,探討如何安裝核心以及核心頭檔。 Debian安裝核心在Debian系統中,安裝新的核心相對直接,可以透過apt指令進行,你需要更新你的套件列表,執行以下指令:```sqlsudoapt-getupdate```你可以使用以下指令來安裝新的內核:s

See all articles