本篇文章帶大家深入解析一下PHP Running process。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
PHP的底層語言是C語言 C語言是編譯型 語言。
我用processon做了張圖 以後慢慢再持續填坑編譯型語言:程式執行前需要一個專門的編譯過程,把程式編譯成機器語言的文件,執行時間不需要重新翻譯,直接使用編譯的結果就行了。程式執行效率高,依賴編譯器,跨平台性差一點
----------.怎麼變成解釋型語言的呢?
#圖片如果不清晰可以看原圖
網址:http://assets.processon.com/chart_image/603b293b1e08530bb1adcb1c.png##簡單說明下圖片的流程#一 先不考慮CLI和FPM等流程 C語言透過open_file_sanning函數解析到php後綴的檔案
二 呼叫編譯函數zend_compile_file()來進行編譯。這個函數的具體實現其實是包含兩個主要過程的:詞法分析(Lex實現),語法分析(Yacc實現)。執行完這個函數之後:php腳本的編譯就算結束了。這個函數的輸入是:php腳本文件,而輸出則是op_array.簡單一點說:編譯過程就是把腳本給解析成一條條php虛擬機可以處理的指令,而op_array就是這些指令做成的一個array而已(這很類似一些編譯型語言編譯產生的組譯程式碼了,也是一則的指令
三 VM虛擬機呼叫zend_execute()函數來執行。該函數的輸入就是上邊編譯階段產生的op_array,在這裡他會解析每條指令並進行處理。在PHP7.4.5中op指令一共有將近200條所以它需要處理這些指令。每個指令都是有對應的處理器來進行處理的。zend虛擬擬機會依據op_array中各條指令的類型來分發給回應的處理器來處理。
這裡的處理器是zend虛擬機的處理器。不是CPUZend虛擬機處理器其實是處理op指令的邏輯。其可以函數的形式存在,也可能是以邏輯段的方式存在,這取決於指令的分發方式Zend 虛擬機器中分發指令的機制有三種:CALL , SWITCH, 和GOTO這三種類型. switch和goto都是在zend_execute()這個函數中有對應的邏輯段,直接執行就可以了。而call是在zend_execute()這個函數中執行函數呼叫。
你可以發現PHP程式碼其實跑在了zend vm虛擬機裡沒有直接運行在CPU中而 PHP8 中JIT的出現可以讓部分程式碼彙編成機器碼跑在CPU中 關於這部分可以參考 @rhett文章《PHP JIT 技術詳解》做的分析。文章地址:https://zhuanlan.zhihu.com/p/331777202#感謝陳雷前輩的《PHP7原始碼底層設計與實作》
本文經原作者PHP崔雪峰同意,發佈於php中文網,原文網址:https://zhuanlan.zhihu.com/p/353501903
推薦學習:《PHP影片教學
》
以上是深入解析PHP底層之Running process的詳細內容。更多資訊請關注PHP中文網其他相關文章!