php程式的啟動可以看作有兩個概念上的啟動,終止也有兩個概念上的終止。
其中乙個是php作為apache(拿它舉例,板磚勿扔)的乙個模組的啟動與終止,
這次啟動php會初始化一些必要資料,比如與宿主apache有關的,並且這些資料是常駐記憶體的!
終止與之相對。
還有乙個概念上的啟動就是當apache分配乙個頁面請求過來的時候,php會有一次啟動與終止,這也是我們最常討論的一種。
現在我們主要來看乙個php擴充套件的生命旅程是怎樣走完這四個過程的。
在最初的初始化時候,就是php隨著apache的啟動而誕生在記憶體裡的時候,
它會把自己所有已載入擴充套件的minit方法(全稱module initialization,是由每個模組自己定義的函式。)都執行一遍。
在這個時間裡,擴充套件可以定義一些自己的常量、類、資源等所有會被使用者端的php指令碼用到的東西。
但你要記住,這裡定義的東東都會隨著apache常駐記憶體,可以被所有請求使用,直到apache解除安裝掉php模組!
核心中預置了php_minit_function巨集函式,來幫助我們實現這個功能:
//拋棄作者那個例子,書才看兩頁整那樣的例子太複雜了!
//walu是我擴充套件的名稱
int time_of_minit;//在minit()中初始化,在每次頁面請求中輸出,看看是否變化
php_minit_function(walu)
當乙個頁面請求到來時候,php會迅速的開闢乙個新的環境,並重新掃瞄自己的各個擴充套件,
遍歷執行它們各自的rinit方法(俗稱request initialization),
這時候乙個擴充套件可能會初始化在本次請求中會使用到的變數等,
還會初始化等會兒使用者端(即php指令碼)中的變數之類的,核心預置了php_rinit_function()這個巨集函式來幫我們實現這個功能:
int time_of_rinit;//在rinit裡初始化,看看每次頁面請求的時候是否變化。
php_rinit_function(walu)
好了,現在這個頁面請求執行的差不多了,可能是順利的走到了自己檔案的最後,
也可能是出師未捷,半道被使用者給die或者exit了,
這時候php便會啟動**程式,收拾這個請求留下的爛攤子。
它這次會執行所有已載入擴充套件的rshutdown(俗稱request shutdown)方法,
這時候擴充套件可以抓緊利用核心中的變數表之類的做一些事情,
因為一旦php把所有擴充套件的rshutdown方法執行完,
便會釋放掉這次請求使用過的所有東西,
包括變數表的所有變數、所有在這次請求中申請的記憶體等等。
核心預置了php_rshutdown_function巨集函式來幫助我們實現這個功能
php_rshutdown_function(walu)
前面該啟動的也啟動了,該結束的也結束了,現在該apache老人家歇歇的時候,當apache通知php自己要stop的時候,php便進入mshutdown(俗稱module shutdown)階段。這時候php便會給所有擴充套件下最後通牒,如果哪個擴充套件還有未了的心願,就放在自己mshutdown方法裡,這可是最後的機會了,一旦php把擴充套件的mshutdown執行完,便會進入自毀程式,這裡一定要把自己擅自申請的記憶體給釋放掉,否則就杯具了。
核心中預置了php_mshutdown_function巨集函式來幫助我們實現這個功能:
php_mshutdown_function(walu)
這四個巨集都是在walu.c裡完成最終實現的,而他們的則是在/main/php.h裡被定義的(其實也是呼叫的別的巨集,本節最後我把這幾個巨集給展開了,供有需要的人檢視)。
好了,現在我們本節內容說完了,下面我們把所有的**合在一起,並**一下應該出現的結果:
//這些**都在walu.c裡面,不在.h裡
int time_of_minit;//在minit中初始化,在每次頁面請求中輸出,看看是否變化
php_minit_function(walu)
int time_of_rinit;//在rinit裡初始化,看看每次頁面請求的時候是否變化。
php_rinit_function(walu)
php_rshutdown_function(walu)
php_mshutdown_function(walu)
//我們在頁面裡輸出time_of_minit和time_of_rinit的值
php_function(walu_test)
多謝 閘北陸小洪 指出的有關time_of_rinit的筆誤。上面便是php中典型的啟動-終止模型,實際情況可能因為模式不同而有所變化,
到底php的啟動-終止會有多少種不同變化方式,請看下一節。
Oracle的啟動和關閉
例項的概念 例項是oracle用來管理資料庫的乙個實體,它由位於伺服器中的記憶體結構和一系列服務程序組成.乙個例項只能訪問乙個資料庫,而乙個資料庫可以由多個例項同時訪問.例項在使用者和資料庫之間充當乙個中介軟體的角色.資料庫跟例項是兩回事情,資料庫主要是指oracle儲存資料的一系列物理儲存結構.資...
Oracle的啟動和關閉
二 資料庫狀態切換 三 關閉資料庫 oracle資料庫的啟用和關閉需要dba許可權,本文介紹的全部操作由sysdba來執行。在執行資料庫例項的作業系統的shell裡執行以下命令就可以獲得sysdba許可權。oracle資料庫例項的啟動要經歷三個階段。1 nomount 啟動例項 start an i...
Oracle的啟動和關閉
二 資料庫狀態切換 三 關閉資料庫 oracle資料庫的啟用和關閉需要dba許可權,本文介紹的全部操作由sysdba來執行。在執行資料庫例項的作業系統的shell裡執行以下命令就可以獲得sysdba許可權。oracle資料庫例項的啟動要經歷三個階段。1 nomount 啟動例項 start an i...