php的生命週期

一、PHP的運行模式:

    PHP兩種運行模式是WEB模式、CLI模式。不管哪一種模式,PHP工做原理都是同樣的,做爲一種SAPI運行。php

一、當咱們在終端敲入php這個命令的時候,它使用的是CLI。mysql

它就像一個web服務器同樣來支持php完成這個請求,請求完成後再從新把控制權交給終端。web

二、當使用Apache或者別web服務器做爲宿主時,當一個請求到來時,PHP會來支持完成這個請求。通常有:sql

    多進程(一般編譯爲apache的模塊來處理PHP請求)數據庫

    多線程模式apache

簡要的執行過程:編程

1. PHP是隨着Apache的啓動而運行的;瀏覽器

2. PHP經過mod_php5.so模塊和Apache相連(具體說來是SAPI,即服務器應用程序編程接口);
3. PHP總共有三個模塊:內核、Zend引擎、以及擴展層;
4. PHP內核用來處理請求、文件流、錯誤處理等相關操做;
5. Zend引擎(ZE)用以將源文件轉換成機器語言,而後在虛擬機上運行它;
6. 擴展層是一組函數、類庫和流,PHP使用它們來執行一些特定的操做。好比,咱們須要MySQL擴展來鏈接MySQL數據庫
7. 當ZE執行程序時可能會須要鏈接若干擴展,這時ZE將控制權交給擴展,等處理完特定任務後再返還;
8. 最後,ZE將程序運行結果返回給PHP內核,它再將結果傳送給SAPI層,最終輸出到瀏覽器上。服務器

2. 運行PHP的幾個階段:

SAPI運行PHP都通過下面幾個階段:
       一、模塊初始化階段(Module init)     :
           即調用每一個擴展源碼中的的PHP_MINIT_FUNCTION中的方法初始化模塊,進行一些模塊所需變量的申請,內存分配等。
        二、請求初始化階段(Request init)  :
           即接受到客戶端的請求後調用每一個擴展的PHP_RINIT_FUNCTION中的方法,初始化PHP腳本的執行環境。
        三、執行PHP腳本
        四、請求結束(Request Shutdown) 
          這時候調用每一個擴展的PHP_RSHUTDOWN_FUNCTION方法清理請求現場,而且ZE開始回收變量和內存。
        五、關閉模塊(Module shutdown)     :
           Web服務器退出或者命令行腳本執行完畢退出會調用擴展源碼中的PHP_MSHUTDOWN_FUNCTION 方法多線程

3. 各類狀況下的SAPI生命週期。

1. 單進程SAPI生命週期。(CGI)

CLI/CGI模式的PHP屬於單進程的SAPI模式。這類的請求在處理一次請求後就關閉。也就是說每次請求都會重複這幾個環節: 開始 - 請求開始 - 請求關閉 - 結束 。能夠看到擴展的初始化花費了不少資源。

2. 多進程SAPI生命週期。(MPM的perfork方式)

一般PHP是編譯爲apache的一個模塊來處理PHP請求(mod_php)。Apache通常會採用多進程模式, Apache啓動後會fork出多個子進程(apache裏能夠指定開始fork出來的進程數)。每一個進程的內存空間獨立,每一個子進程剛被fock出來都會通過開始和結束環節。

3. 多線程的SAPI生命週期。(FastCGI或者MPM的work方式裏的單個進程)

多線程模式和多進程中的某個進程相似,在這種模式下,只有一個服務器進程在運行着,但會同時運行不少線程,這樣能夠減小一些資源開銷,向Module init和Module shutdown就只須要運行一遍就好了,一些全局變量也只須要初始化一次,由於線程獨具的特質,使得各個請求之間方便的共享一些數據成爲可能。

參考:http://blog.csdn.net/hguisu/article/details/7377520

相關文章
相關標籤/搜索