首頁  >  文章  >  後端開發  >  PHP7的執行過程你了解嗎?

PHP7的執行過程你了解嗎?

藏色散人
藏色散人轉載
2021-09-12 16:24:081822瀏覽

#PHP 是解釋型語言,其執行過程需先編譯成中間程式碼,再經由特定的虛擬機,翻譯成特定的指令被執行。其執行程序如下:
PHP 程式碼=> Token => 抽象語法樹=> Opcodes => 執行

各步驟內容如下:
原始碼透過詞法分析得到Token
Token 是PHP 代碼被切割成的有意義的標識。 PHP7 總共有 137 種 Token,在 zend_language_parser.h 檔案中做了定義。

基於語法分析器將Token 轉換成抽象語法樹(AST)
Token 就是一個個的詞塊,但是單獨的詞塊不能表達完整的語義,還需要藉助一定的規則進行組織串聯。所以就需要語法分析器根據語法來配對 Token,將 Token 進行串聯。語法分析器串聯完 Token 後的產物就是抽象語法樹(AST,Abstract Syntax Tree)。

AST 是 PHP7 版本的新特性,先前版本的 PHP 程式碼的執行過程中是沒有產生 AST 這一步驟的。它的作用主要是實作了 PHP 編譯器和解譯器的解耦,提升了可維護性。

將語法樹轉換成 Opcode
需要將語法樹轉換成 Opcode,才能被引擎直接執行。

執行 Opcodes
opcodes 是 opcode 的集合形式,是 PHP 執行過程中的中間程式碼。 PHP 工程最佳化措施中有一個比較常見的 “開啟 opcache”,指的技術這裡將 opcodes 進行快取。透過省去從原始碼到 opcode 的階段,引擎直接執行快取好的 opacode,以提升效能。

PHP7 核心架構
PHP7的執行過程你了解嗎?

zend 引擎
詞法 / 語法分析、AST 編譯和 opcodes 的執行均在 Zend 引擎中實現。此外,PHP 的變數設計、記憶體管理、進程管理等也在引擎層實現。

PHP 層
zend 引擎為 PHP 提供基礎能力,而來自外部的互動則需要透過 PHP 層來處理。

SAPI
server API 的縮寫,其中包含了場景的 cli SAPI 和 fpm SAPI。只要遵守定義好的 SAPI 協議,外部模組就能與 PHP 完成互動。

擴充部分
依據 zend 引擎提供的核心能力和介面規範,可以進行開發擴充。

PHP 7 原始碼結構
php 7 的原始碼主要目錄有:sapi 、Zend、main、ext 和 TSRM 這幾個。
sapi 目錄
sapi 目錄是輸入和輸出層的抽象,是 PHP 提供對外服務的規格。
幾種常用的 SAPI:
1)apache2handler: Apache 擴展,編譯後產生動態連結函式庫,配置到 Apache 下。當有 http 請求到 Apache 時,根據配置會呼叫此動態連結函式庫來執行 PHP 程式碼,完成與 PHP 的互動。
2)cgi-fcgi: 編譯後產生支援 CGI 協定的可執行程序,webserver(如 NGINX)透過 CGI 協定把請求傳給 CGI 進程,CGI 進程會根據請求執行對應程式碼後將執行結果傳回給 webserver。
3)fpm-fcgi: fpm 是 FastCGI 進程管理器。以 NGINX 伺服器為例,當有請求傳送到 NGINX 伺服器,NGINX 依照 FastCGI 協定把請求交給 php-fpm 進程處理。
4)cli: PHP 的命令列互動介面
Zend 目錄
Zend 目錄是 PHP 的核心程式碼。 PHP 中的記憶體管理,垃圾回收、進程管理、變數、陣列實作等都在該目錄的源碼裡。

main 目錄
main 目錄是 SAPI 層和 Zend 層的黏合劑。 Zend 層實現了 PHP 腳本的編譯和執行,sapi 層實現了輸入和輸出的抽象,main 目錄則在它們中間起著承上啟動的作用。承上,解析 SAPI 的請求,分析要執行的腳本檔案和參數;啟動下,在呼叫 zend 引擎之前,完成必要的模組初始化等工作。

ext 目錄
ext 是 PHP 擴充功能相關的目錄,常用的 array、str、pdo 等系列函數都在這裡定義。

TSRM
TSRM(Thread Safe Resource Manager)- 執行緒安全資源管理器, 是用來確保資源共享的安全性。

以上是PHP7的執行過程你了解嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除