詳解PHP的執行原理與流程
這篇文章介紹的內容是關於詳解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 */ }
- #1 ##2
- 3
- PHP啟動第二步驟
• 當一個頁面要求發生時,SAPI層會將控制權交給PHP層。於是PHP設定了回覆本次請求所需的環境變數。同時,它也建立一個變數表,用來存放執行過程中產生的變數名稱和值。
• PHP呼叫各個模組的RINIT方法,即「請求初始化」。一個經典的例子是Session模組的RINIT,如果在php.ini中啟用了Session模組,那麼在呼叫該模組的RINIT時就會初始化$_SESSION變量,並將相關內容讀入;# • RINIT方法可以看作是一個準備過程,在程式執行之間就會自動啟動。
一個典型的RINIT方法如下:
PHP_RINIT_FUNCTION(extension_name) { /* Initialize session variables, pre-populate variables, redefine global variables etc */ }
- #1
- ##2
- 3
PHP关闭第一步
如同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
PHP关闭第二步
最后,所有的请求都已处理完毕,SAPI也准备关闭了,PHP开始执行第二步:
• PHP调用每个扩展的MSHUTDOWN方法,这是各个模块最后一次释放内存的机会。
一个典型的RSHUTDOWN方法如下:
PHP_MSHUTDOWN_FUNCTION(extension_name) { /* Free handlers and persistent memory etc */ }
1
2
3
这样,整个PHP生命周期就结束了。要注意的是,只有在服务器没有请求的情况下才会执行“启动第一步”和“关闭第二步”。
下面的是用一些图示来说明的!
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的關係
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的生命週期
Apach的請求處理流程
Apache請求處理循環詳解
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一次請求處理的最後一個階段。
LAMP架構
# 從下往上四層:
①liunx 屬於作業系統的底層
②apache伺服器,屬於次伺服器,溝通linux和PHP
③php:屬於服務端程式語言,透過php_module 模組和apache關聯
④mysql和其他web服務:屬於應用服務,透過PHP的推薦建議值外掛模組和sqlmy
以上是詳解PHP的執行原理與流程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。
