PHP內核探索:一次請求的開始與結束

開始階段有兩個過程:php

第一個過程是模塊初始化階段(MINIT), 在整個SAPI生命週期內(例如Apache啓動之後的整個生命週期內或者命令行程序整個執行過程當中), 該過程只進行一次。服務器

第二個過程是模塊激活階段(RINIT),該過程發生在請求階段, 例如經過url請求某個頁面,則在每次請求以前都會進行模塊激活(RINIT請求開始)。 例如PHP註冊了一些擴展模塊,則在MINIT階段會回調全部模塊的MINIT函數。 模塊在這個階段能夠進行一些初始化工做,例如註冊常量,定義模塊使用的類等等。函數

模塊在實現時能夠經過以下宏來實現這些回調函數:url

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

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

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

請求處理完後就進入告終束階段,通常腳本執行到末尾或者經過調用exit()或die()函數, PHP都將進入結束階段。和開始階段對應,結束階段也分爲兩個環節,一個在請求結束後停用模塊(RSHUWDOWN,對應RINIT), 一個在SAPI生命週期結束(Web服務器退出或者命令行腳本執行完畢退出)時關閉模塊(MSHUTDOWN,對應MINIT)。code

    PHP_RSHUTDOWN_FUNCTION(myphpextension)    
    {    
        // 例如記錄請求結束時間,並把相應的信息寫入到日至文件中。    
        return SUCCESS;     
    }
相關文章
相關標籤/搜索