這裏的拓展分爲了兩種,一般在php.ini中,經過extension=加載的擴展咱們稱爲PHP擴展,經過zend_extension=加載的擴展咱們稱爲Zend擴展,但從源碼的角度來說,PHP擴展應該稱爲「模塊」(源碼中以module命名),而Zend擴展稱爲「擴展」(源碼中以extension命名)。二者最大的區別在於向引擎註冊的鉤子,向用戶層面提供一些C實現的PHP函數,須要用到zend_module_entry(即做爲PHP擴展),而須要hook到Zend引擎的話,就得用到zend_extension(即做爲Zend擴展)。php
<?php echo "Hello world";
切割成了4部分html
<?php => #define T_OPEN_TAG 379 echo => #define T_ECHO 328 空格 => #define T_WHITESPACE 382 "hello world" => #define T_CONSTANT_ENCAPSED_STRING 323
單獨存在的詞塊不能完整表達語義,還須要語法分析器,它會檢查語法,匹配Token,對Token進行關聯,組織串聯後的產物就是AST.AST 分爲多種類型,對應PHP語法,好比賦值語句,生成的抽象語法樹節點是ZEND_AST_ASSIGN,賦值語句的左右會被做爲ZEND_AST_ASSIGN類型節點的孩子(AST是PHP7才加入的,解耦了編譯器和解釋器).git
opcode是PHP執行過程當中的中間代碼,生成後由虛擬機執行,生成的opcode是相似下面的樣子github
line op 1 ECHO 2 RETURN
源碼中對應的opcode及handler算法
ZEND_ECHO // handler:ZEND_ECHO_SPEC_CONST_HANDLER 實現的功能是輸出"hello world" ZEND_RETURN // handler:ZEND_RETURN_SPEC_CONST_HANDLER
=> compile_file => open_file_for_scanning(讀取PHP代碼內容,並使詞法分析指針指向第一個位置) => zendparse(詞法分析語法分析後生成AST) => init_op_array(初始化op_array) => zend_compile_top_stmt(把AST轉爲op_array) => pass_two(設置op_array對應的zend虛擬機handler) => 生成op_array => zend_execute(zend虛擬機中執行op_array)
fcgi.c ... FCGI_LOCK(req->listen_socket); req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len); FCGI_UNLOCK(req->listen_socket);
引用數組