php的執行過程

2021-08-25 09:07:54 字數 841 閱讀 5452

比如我們有乙個php檔案test.php如下

<?php echo "hello world" ?>

執行php test.php實際是什麼樣的呢?

主要過程如下

1、呼叫zend_compile_file(這其實是個函式指標,預設實現是compile_file),這個函式其實就是呼叫lex根據zend_language_scanner.l裡的定義進行詞法分析,然後呼叫yacc根據zend_language_parser.y裡的定義生成opcode,關於opcode的內容,請參考鳥哥的部落格這裡其實只是完成了語法解析,必沒有對這些opcode如何操作進行賦值,然後呼叫pass_two函式對所有生成的opcode進行賦值。具體工作都在zend_vm_set_opcode_handler中完成了,而它主要是根據事先定義zend_opcode_handlers表來進行查詢。

2、接下來就是呼叫zend_execute(其實也是乙個函式指標,預設實現是execute方法),這個方法就更簡單了,乙個while迴圈來呼叫每個opcode所指定的handler即可。

那麼對於zend裡的函式呼叫其實分為兩種,一種是zend裡定義的內建函式,一種是php裡使用者自定義的函式。而第二種又可以分為直接呼叫的,和call_user_func_***函式呼叫的。前面一種是直接以opcode的方法進行,實際的執行函式是zend_do_fcall_by_name_spec_handler。而call_user_func_***是呼叫call_user_function_ex來實現,這兩個函式實現在同小異,最後都將函式的opcode載入到eg(active_op_code)中,然後再呼叫zend_execute。

從這裡我們可以看到,其實zend_exeucte是被巢狀了的。

php的執行過程

1.我們從未手動開啟過php的相關程序,它是隨著apache的啟動而執行的 2.php通過mod php5.so模組和apache相連 具體說來是sapi,即伺服器應用程式程式設計介面 3.php總共有三個模組 核心 zend引擎 以及擴充套件層 4.php核心用來處理請求 檔案流 錯誤處理等相關操...

php的執行過程

1.我們從未手動開啟過php的相關程序,它是隨著apache的啟動而執行的 2.php通過mod php5.so模組和apache相連 具體說來是sapi,即伺服器應用程式程式設計介面 3.php總共有三個模組 核心 zend引擎 以及擴充套件層 4.php核心用來處理請求 檔案流 錯誤處理等相關操...

php的執行過程

1.我們從未手動開啟過php的相關程序,它是隨著apache的啟動而執行的 2.php通過mod php5.so模組和apache相連 具體說來是sapi,即伺服器應用程式程式設計介面 3.php總共有三個模組 核心 zend引擎 以及擴充套件層 4.php核心用來處理請求 檔案流 錯誤處理等相關操...