用了2年php了,只知其外,不知其裡,不得其意;學習中,要點記在這裡;
一切的開始:SAPI接口
SAPI(server application programming interface)指的是php的具體應用編程接口,php腳本要執行有很多種方式,比如:通過web服務器、命令行,也可以嵌入其它程序中;通常我們使用apache或者nginx這類web服務器來測試php腳本,或者在命令行來執行腳本,腳本執行完後,web服務器應答,浏覽器顯示應答信息,或者在終端上顯示內容.
1)模塊初始化階段(MINIT),在整個sapi生命周期內(例如apache啟動以後的整個生命周期內或命令行程序整個執行過程中),該過程只執行一次。
2)模塊激活階段(RINIT),該過程發生在請求階段,例如通過url請求某個頁面,那麼在請求之前都會進行模塊激活;例如php注冊的一些擴展模塊,則在MINIT階段會回調所有模的MINIT函數。模塊在這個階段會進行一些初始化工作,例如注冊常量,定義模塊使用的類等等。
2.請求處理:請求到達之後php初始化執行腳本的基本環境,例如創建一個執行環境,包括保存php運行過程中變量名稱和值內容的符號表,以及當前的所有的函數以及類等信息的符號表。然後php會調用所有模塊的RINIT函數,在這個階段各個模塊也可以執行一些相關的操作;
3.請求結束:請求處理後就進入結束階段,一般腳本執行到末尾通過調用exit()或die()函數,php都將進入結束階段;和開始階段對應,結束階段也分為兩個環節
1)停用模塊(RSHUTDOWN,對應RINIT)
2)sapi生命周期結束(web服務器退出或者命令行執行完畢退出)時關閉模塊(MSHUTDOWN,對應MINIT)
單進程SAPI生命周期
命令行模式的php屬於單進程的sapi模式,這類請求在處理一次後就關閉,整個處理流程只有以下幾個環節:開始-請求開始-請求關閉-結束 sapi接口實現就完成了其生命周期。單進程sapi生命周期如圖:
多進程SAPI生命周期
除了命令行外,還有另外一種最多的處理php請求的莫過於web服務器了,比如apache;apache作為web服務器都會采用多進程模式,apache啟動後會fork出多個自進程,每個進程的內存空間獨立,每個子進程都會經過開始和結束環節,不過每個子進程的開始只在進程fork出來以後進行,在整個進程的生命周期裡可能會處理多個請求。只有在apache關閉或者進程被結束之後才會進入關閉階段,在這兩個階段之間會隨著每個請求進行 請求開始-請求關閉的環節。多進程sapi生命周期如圖。
多線程SAPI生命周期
多線程模式和多進程模式類似,不同的是在整個生命周期內會並行的重復著 請求開始-請求關閉環節
(轉載請注明出處:作者:jmol,微博:http://weibo.com/yospace 博客園:http://www.cnblogs.com/yoainet/)