這篇文章介紹的內容是關於詳解PHP的執行原理和流程,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
##簡介 • 我們從未手動開啟過PHP的相關進程,它是隨著Apache的啟動而運行的;
• PHP透過mod_php5. so模組與Apache相連(具體來說是SAPI,也就是伺服器應用程式介面);
• PHP總共有三個模組:核心、Zend引擎、以及擴充層;
# • PHP核心用來處理請求、文件流、錯誤處理等相關操作;
• Zend引擎(ZE)用以將原始檔案轉換成機器語言,然後在虛擬機器上運行它;
• 擴充層是一組函數、類別庫和流,PHP使用它們來執行一些特定的操作。例如,我們需要mysql擴展來連接MySQL資料庫;
• 當ZE執行程式時可能會需要連接若干擴展,這時ZE將控制權交給擴展,等處理完特定任務後再返還;
•最後,ZE將程式運行結果傳回PHP內核,它再將結果傳送給SAPI層,最後輸出到瀏覽器上。
深入探討
等等,沒有這麼簡單。以上過程只是個簡略版,讓我們再深入挖掘一下,看看幕後還發生了些什麼。
• Apache啟動後,PHP解釋程式也隨之啟動;
• PHP的啟動過程有兩步驟;
• 第一步是初始化一些環境變量,這將在整個SAPI生命週期中發生作用;
• 第二步是產生只針對目前請求的一些變數設定。
• 啟動Apache後,PHP解釋程式也隨之啟動;
• PHP呼叫各個擴充的MINIT方法,從而使這些擴充切換到可用狀態。看看php.ini檔案裡打開了哪些擴充;
• MINIT的意思是「模組初始化」。各個模組都定義了一組函數、類別庫等用以處理其他請求。
一個典型的MINIT方法如下:
PHP_MINIT_FUNCTION(extension_name){ /* Initialize functions, classes etc */ }
# • RINIT方法可以看作是一個準備過程,在程式執行之間就會自動啟動。
一個典型的RINIT方法如下:
PHP_RINIT_FUNCTION(extension_name) { /* Initialize session variables, pre-populate variables, redefine global variables etc */ }
如同PHP启动一样,PHP的关闭也分两步:
• 一旦页面执行完毕(无论是执行到了文件末尾还是用exit或die函数中止),PHP就会启动清理程序。它会按顺序调用各个模块的RSHUTDOWN方法。
• RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。
一个典型的RSHUTDOWN方法如下:
PHP_RSHUTDOWN_FUNCTION(extension_name) { /* Do memory management, unset all variables used in the last PHP call etc */ }
1
2
3
最后,所有的请求都已处理完毕,SAPI也准备关闭了,PHP开始执行第二步:
• PHP调用每个扩展的MSHUTDOWN方法,这是各个模块最后一次释放内存的机会。
一个典型的RSHUTDOWN方法如下:
PHP_MSHUTDOWN_FUNCTION(extension_name) { /* Free handlers and persistent memory etc */ }
1
2
3
这样,整个PHP生命周期就结束了。要注意的是,只有在服务器没有请求的情况下才会执行“启动第一步”和“关闭第二步”。
下面的是用一些图示来说明的!
从图上可以看出,php从下到上是一个4层体系
①Zend引擎
Zend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕zend实现。
②Extensions
围绕着zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的php中间层、富文本解析就是extension的典型应用)。
③Sapi
Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过sapi成功的将php本身和上层应用解耦隔离,php可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。后面将在sapi章节中介绍
④上层应用
这就是我们平时编写的php程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等。
引擎(Zend) 元件(ext)的模式降低內部耦合
中間層(sapi)隔絕web server和php
#*** ************************************************** ***********
如果php是一輛車,那麼
車的車架就是php本身
Zend是車的引擎(引擎)
Ext下面的各種組件就是車的輪子
Sapi可以看做是公路,車可以跑在不同類型的公路上
而一次php程式的執行就是汽車跑在公路上。
因此,我們需要:性能優異的引擎合適的車輪正確的跑道
Apache對於php的解析,就是透過眾多Module中的php Module來完成的。
把php最終整合到Apache系統中,還需要對Apache進行一些必要的設定。這裡,我們就以php的mod_php5 SAPI運行模式為例進行講解,至於SAPI這個概念後面我們還會詳細講解。
假定我們安裝的版本是Apache2 和Php5,那麼需要編輯Apache的主配置文件http.conf,在其中加入下面的幾行內容:
Unix/Linux環境下:
LoadModule php5_module modules/ mod_php5.so
AddType application/x-httpd-php .php
註:其中modules/mod_php5.so 是X系統環境下mod_php5.so檔案的安裝位置。
Windows環境下:
LoadModule php5_module d:/php/php5apache2.dll
AddType application/x-httpd-php .php
注:其中在Windowsdache/php.環境下php5apache2.dll檔案的安裝位置。
這兩個配置就是告訴Apache Server,以後收到的Url使用者請求,凡是以php作為後綴,就需要呼叫php5_module模組(mod_php5.so/ php5apache2.dll)來處理。
Apache請求處理循環的11個階段都做了哪些事情?
1、Post-Read-Request階段
在正常請求處理流程中,這是模組可以插入鉤子的第一個階段。對於那些想很早進入處理請求的模組來說,這個階段可以被利用。
2、URI Translation階段
Apache在本階段的主要工作:將要求的URL對應到本機檔案系統。模組可以在這階段插入鉤子,執行自己的映射邏輯。 mod_alias就是利用這個階段來運作的。
3、Header Parsing階段
Apache在本階段的主要工作:檢查請求的頭部。由於模組可以在請求處理流程的任何一個點上執行檢查請求頭部的任務,因此這個鉤子很少被使用。 mod_setenvif就是利用這個階段工作的。
4、Access Control階段
Apache在本階段的主要工作:根據設定檔檢查是否允許存取請求的資源。 Apache的標準邏輯實作了允許和拒絕指令。 mod_authz_host就是利用這個階段運作的。
5、Authentication階段
Apache在本階段的主要工作:依照設定檔設定的策略對使用者進行認證,並設定使用者名稱區域。模組可以在這階段插入鉤子,實現一個認證方法。
6、Authorization階段
Apache在本階段的主要工作:根據設定檔檢查是否允許認證過的使用者執行請求的操作。模組可以在這階段插入鉤子,實作一個使用者權限管理的方法。
7、MIME Type Checking階段
Apache在本階段的主要工作:根據要求資源的MIME類型的相關規則,判定將要使用的內容處理函數。標準模組mod_negotiation和mod_mime實現了這個鉤子。
8、FixUp階段
這是一個通用的階段,允許模組在內容產生器之前,執行任何必要的處理流程。和Post_Read_Request類似,這是一個能夠捕捉任何資訊的鉤子,也是最常使用的鉤子。
9、Response階段
Apache在本階段的主要工作:產生傳回客戶端的內容,負責傳送一個適當的回覆客戶。這個階段是整個處理流程的核心部分。
10、Logging階段
Apache在本階段的主要工作:在回覆已傳送給客戶端之後記錄事務。模組可能修改或替換Apache的標準日誌記錄。
11、CleanUp階段
Apache在本階段的主要工作:清理本次請求事務處理完成之後遺留的環境,例如文件、目錄的處理或Socket的關閉等等,這是Apache一次請求處理的最後一個階段。
# 從下往上四層:
①liunx 屬於作業系統的底層
②apache伺服器,屬於次伺服器,溝通linux和PHP
③php:屬於服務端程式語言,透過php_module 模組和apache關聯
④mysql和其他web服務:屬於應用服務,透過PHP的推薦建議值外掛模組和sqlmy
以上是詳解PHP的執行原理與流程的詳細內容。更多資訊請關注PHP中文網其他相關文章!