程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 深入理解PHP內核(二)概覽-PHP生命周期與Zend引擎,-phpzend

深入理解PHP內核(二)概覽-PHP生命周期與Zend引擎,-phpzend

編輯:關於PHP編程

深入理解PHP內核(二)概覽-PHP生命周期與Zend引擎,-phpzend


本文參考自《深入理解PHP內核》,地址:https://github.com/reeze/tipi

1、SAPI接口

SAPI(Server Application Programming Interface)指的是PHP具體應用的編程接口。PHP腳本要執行可以用很多種方式:通過web服務器、命令行、嵌入到其他程序中。

雖然通過web服務器和命令行程序執行腳本看起來很不一樣,但是實際的流程是一樣的。只不過是web服務器方式是將php腳本執行結果返回給web服務器,命令行是將結果打印到控制台。

腳本執行的開始都是以SAPI接口實現開始的,只是不同的SAPI接口實現會完成他們特定的工作,例如Apache的mod_php SAPI實現需要初始化從Apache獲取的一些信息,在輸出內容是將內容返回給Apache,其他SAPI實現也類似

2、開始和結束

 (1)PHP開始執行後會經過兩個階段:處理請求之前的開始階段和請求之後的結束階段。開始階段有兩個過程:第一個過程是模塊初始化階段(MINIT),在整個SAPI生命周期內(例如Apache啟動之後的整個生命周期或者命令行程序整個執行過程中),該過程只進行一次。第二個過程是模塊激活階段(RINIT),該過程發生在請求階段,例如通過url請求某個頁面,則在每次請求之前都會進行模塊激活(RINIT請求開始)。例如PHP注冊了一些擴展模塊,則在MINIT階段回調所有模塊的MINIT函數。模塊在這個階段進行一些初始化工作,例如注冊常量,定義模塊使用的類等等。模塊在實現時可以通過如下宏來實現這些回調函數:

PHP_MINIT_FUNCTION(myphpextension)
{
    // 注冊常量或者類等初始化操作
    return SUCCESS;      
}

請求到達之後PHP初始化腳本的基本環境,例如創建一個執行環境,包括保存PHP運行過程中變量名稱和值內容的符號表,以及當前所有的函數以及類等信息的符號表。然後PHP會調用所有模塊的RINIT函數,在這個階段各個模塊也可以執行一些相關的操作,模塊RINIR函數和MINIT回調函數類似:

PHP_RINIT_FUNCTION(myphpextension)
{
    // 例如記錄請求開始時間
    // 隨後在請求結束的時候記錄結束時間,這樣我們就能記錄下處理請求所花費的時間了
    return SUCCESS;
}

 

請求處理完之後就進入結束階段,一般腳本執行到末尾或者通過調用die()或exit()函數,PHP都將進入結束階段。結束階段也有兩個環節:一個在請求結束後停用模塊(RSHUTDOWN,對應RINIT),一個在SAPI生命周期結束(web服務器退出或者命令行腳本執行完畢退出)時關閉模塊(MSHUTDOWN,對應MINIT)。

PHP_RSHUTDOWN_FUNCTION(myphpextension)
{
    // 例如記錄請求結束時間,並把相應的信息寫入到日志文件中
    return SUCCESS;
}

 

(2)單進程SAPI生命周期

CLI/CGI模式的PHP屬於單進程的SAPI模式。這類請求在處理一次請求後就關閉了。SAPI生命周期:開始-請求開始-請求關閉-結束 

(3)多進程SAPI生命周期

通常PHP編譯成Apache的一個模塊,Apache通常采用多進程模式,Apache啟動後會fork出多個子進程,每個進程的內存空間獨立,每個子進程都會經過開始和結束環節,不過每個進程的開始階段只在進程fork出來以後進行,在整個進程的生命周期內可能有可能處理多個請求。只有在Apache關閉或者進程被結束之後才進行關閉階段,在這兩個階段會隨著每個請求重復請求開始-請求關閉的環節

(4)多線程模式和多進程中的某個進程類似,不同的是在整個進程的生命周期內會並行的重復著請求開始-請求關閉的環節。

3、Zend引擎

Zend引擎是PHP實現的核心,提供了語言實現上的基礎設施。例如PHP語法的實現、腳本的編譯運行環境、擴展機制以及內存管理等。這裡的PHP指的是官方的PHP實現(另外還有facebook的Hiphop,現已發展成為HHVM,到目前為止(此項目)PHP還沒有一個標准的語言規范),而PHP則提供了請求處理和其他Web服務器的接口(SAPI)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved