PHP底層未完待續

2021-08-11 03:29:50 字數 1264 閱讀 9073

從巨集觀上來看,php核心的實現與世界上絕大多數的程式一樣,接收輸入資料, 做相應處理然後輸出(返回)結果。 我們編寫的**就是php接收的輸入資料,php核心對我們編寫的**進行解釋和運算, 最後返回相應的運算結果。 然而,php與我們自己平時寫的一般的c程式有所不同的是, 我們的程式一般用來解決某個具體問題, 而php本身實現了把使用者的邏輯「翻譯」為機器語言來執行的功能, 這也是各種編譯語言與承載具體業務邏輯的程式**的乙個明顯區別。 於是php就多出乙個把使用者**「翻譯」成具體操作的步驟:詞法分析、語法分析

當使用者**輸入給php核心去執行的時候, php核心會對php**進行詞法分析和語法分析, 詞法分析是把php**分割成乙個個的「單元」(token), 語法分析則將這些「單元」轉化為zend engine可執行的操作。 然後php內部的zend engine對這些操作進行順次的執行。 zend engine是php核心的核心部分,負責最終操作的執行和結果的返回, 可以理解成為php核心中的「發動機」。

傳遞給php程式需要執行的檔案, php程式完成基本的準備工作後啟動php及zend引擎, 載入註冊的擴充套件模組。

初始化完成後讀取指令碼檔案,zend引擎對指令碼檔案進行詞法分析,語法分析。然後編譯成opcode執行。 如果安裝了apc之類的opcode快取, 編譯環節可能會被跳過而直接從快取中讀取opcode執行。

php在讀取到指令碼檔案後首先對**進行詞法分析,php的詞法分析器是通過lex生成的, 詞法規則檔案在$php_src/zend/zend_language_scanner.l, 這一階段lex會會將源**按照詞法規則切分乙個乙個的標記(token)。php中提供了乙個函式token_get_all(), 該函式接收乙個字串引數, 返回乙個按照詞法規則切分好的陣列。

這也是zend引擎詞法分析做的事情,將**切分為乙個個的標記,然後使用語法分析器(php使用bison生成語法分析器, 規則見$php_src/zend/zend_language_parser.y), bison根據規則進行相應的處理, 如果**找不到匹配的規則,也就是語法錯誤時zend引擎會停止,並輸出錯誤資訊。 比如缺少括號,或者不符合語法規則的情況都會在這個環節檢查。 在匹配到相應的語法規則後,zend引擎還會進行編譯, 將**編譯為opcode, 完成後,zend引擎會執行這些opcode, 在執行opcode的過程中還有可能會繼續重複進行編譯-執行, 例如執行eval,include/require等語句, 因為這些語句還會包含或者執行其他檔案或者字串中的指令碼。

如果想直接檢視生成的opcode,可以使用php的vld擴充套件檢視

php編碼規範 未完待續

php編碼規範 未完待續 標準化的重要性和好處 程式設計師可以了解任何 弄清程式的狀況 新人可以很快的適應環境 防止新接觸php的人出於節省時間的需要,自創一套風格並養成終生的習慣 防止新接觸php的人一次次的犯同樣的錯誤 在一致的環境下,人們可以減少犯錯的機會 一 標記 1 2 需要開記php.i...

PHP 設計模式 (未完待續)

一 oop介紹 真理形成的兩大要素 事實和抽象 不要把我們的寶貴的遺產視同兒戲,請珍視這個有序而自由的偉大國度,因為,如果我們蹣跚跌倒,如今的自由和文明將走向毀滅.每人都會得到遺傳給他的一切,他繼承豐富的遺產.二 1 抽象類 class onetrick product inte ce produc...

nginx 未完待續

yum install y pcre yum install y pcre devel yum install y openssl yum install y openssl devel yum install y zlib yum install y gccyum安裝 yum install y ...