PHP底層探索(三):一次請求生命週期

我們從未手動開啓過PHP的相關進程,它是隨着Apache的啓動而永興的.PHP通過mod_php5.so模塊和Apache相連(具體說是SAPI)
PHP總共有三個模塊:內核 zend引擎 擴展層

  • php內核用來處理請求,文件流,錯誤處理等相關操作;
  • zend引擎(ZE) 用來將資源文件轉換成機器語言,然後在虛擬機上運行
  • 擴展層是一組函數,類庫,和流,php使用它們來進行一些特定的操作;

比如,我們需要mysql擴展來來接mysql數據庫;當ZE執行程序時,可能會需要連接若干擴展,這時ZE將程序運行結果返回給PHP內核,它再將結果傳送給SAPI層,最終回饋給瀏覽器;

深入探討
Apache啓動後,PHP解釋程序也隨之啓動.PHP的啓動過程有兩部:

  • 第一步是初始化環境變量,這個將在SAPI聲明週期內發生作用;
  • 第二部是生成只針對當前請求的一些變量設置;

PHP啓動第一步
第一步的操作在任何請求到達之前就發生了.啓動Apache後,PHP解釋程序也隨之啓動.PHP調用各個程序的初始化(MINIT)方法.從而使這些擴展切換到可用狀態;

PHP啓動第二步
當一個頁面發生請求時,SAPI層將控制權交給PHP層.於是PHP設置了用於響應本次請求所需的環境變量;同時,他還建立了一個變量表,來存放執行過程中產生的變量名和值.PHP調用各個模塊的(RINIT)方法.即”請求初始化”. 一個經典的例子是Session模塊的RINIT,如果在php.ini中啓用了Session模塊.那在調用該模塊的RINIT是就會初始化$_SESSION變量,並將相關內容讀入;RINIT方法可以看做是一個準備過程,在執行之間就會自動啓動;

PHP關閉第一步
如同PHP啓動一樣,PHP的關閉也分兩部,一旦頁面執行完畢(無論是執行到了末尾還是exit(),die()函數終止),php就會啓動清理程序.他會按順序調用各個模塊的RSHUTDOWN方法.清楚程序運行時生成的符號表,也就是對每個變量進行ubset()函數.

PHP關閉第二步
最後,所有的請求都已經處理完畢,SAPI也準備關閉了,PHP開始執行第二步,PHP調用每個擴展的MSHUTDOWN方法,這是最後一次釋放內存的機會;

這樣,整個PHP生命週期就結束了.要注意的是,只有在服務器沒有請求的情況下,纔會執行’啓動第一步’,和‘關閉第二步’

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章