本文主要和大家分享php底層之php生命週期詳解,希望能幫助大家。
1、PHP的運作模式:
PHP兩種運作模式分別是WEB模式、CLI模式。 無論哪種模式,PHP工作原理都是一樣的,作為一種SAPI運作。
1、當我們在終端機敲入php這個指令的時候,它使用的是CLI。
它就像一個web伺服器一樣來支援php完成這個請求,請求完成後再重新把控制權交給終端機。
2、當使用Apache或別web伺服器作為宿主時,當一個請求到來時,PHP會來支援完成這個請求。一般有:
多行程(通常編譯為apache的模組來處理PHP請求)
########### ### 多執行緒模式#########2、一切的開始: SAPI介面###### 通常我們寫php Web程式都是透過Apache或Nginx這類Web伺服器來測試腳本. 或者在命令列下透過php程式來執行PHP腳本. 執行完成腳本後,伺服器應答,瀏覽器顯示應答資訊,或在命令結束後在標準輸出顯示內容. 我們很少關心PHP解釋器在哪裡. 雖然透過Web伺服器和命令列程式執行腳本看起來很不一樣. 實際上她們的工作是一樣的. 命令列程式和Web程式類似, 命令列參數傳遞給要執行的腳本,相當於透過url 請求一個PHP頁面. 腳本戳裡完成後回傳回應結果,只不過命令列回應的結果是顯示在終端機上.腳本執行的開始都是透過SAPI介面進行的. ##### ######## 1)、啟動apache###:######當給定的SAPI啟動時,例如在對/usr/local/apache/bin/apachectl start的回應中,PHPstart由初始化其核心子系統開始。在接近啟動例程的末尾,它會載入每個擴充功能的程式碼並呼叫其模組初始化例程(MINIT)。這使得每個擴充功能可以初始化內部變數、分配資源、註冊資源處理器,以及向ZE註冊自己的函數,以便於腳本呼叫這其中的函數時候ZE知道要執行哪些程式碼。 ######
2)、請求處理初始化:接下來,PHP等待SAPI層請求要處理的頁面。對於CGI或CLI等SAPI,這將立刻發生且只發生一次。對於Apache、IIS或其他成熟的web伺服器SAPI,每次遠端使用者要求頁面時都會發生,因此重複很多次,也可能並發。不管請求如何產生,PHP開始於要求ZE建立腳本的運行環境,然後呼叫每個擴充的請求初始化 (RINIT)函數。 RINIT使得擴展有機會設定特定的環境變量,根據請求分配資源,或執行其他任務,如審核。 session擴充中有個RINIT作用的典型範例,如果啟用了session.auto_start選項,RINIT將自動觸發用戶空間的session_start()函數以及預組裝$_SESSION變數。
3)、執行php程式碼: 一旦請求被初始化了,ZE開始接手控制權,將PHP腳本翻譯成符號,最終形成操作碼並逐步執行之。如任一操作碼需要呼叫擴充的函數,ZE將會把參數綁定到該函數,並且暫時交出控制權直到函數運行結束。
4)、腳本結束:腳本運行結束後,PHP調用每個擴充功能的請求關閉(RSHUTDOWN)函數以執行最後的清理工作(如將session變數存入磁碟) 。接下來,ZE執行清理過程(垃圾收集)-有效地對先前的請求期間所用到的每個變數執行unset()。
5)、sapi關閉:一旦完成,PHP繼續等待SAPI的其他文件請求或關閉訊號。 對於CGI和CLI等SAPI,沒有“下一個請求”,所以SAPI立刻開始關閉。關閉期間,PHP再次遍歷每個擴展,呼叫其模組關閉(MSHUTDOWN)函數,並最終關閉自己的核心子系統。
簡單的過程如下:
1. PHP是隨著Apache的啟動而運作的;
2. PHP透過modphp_55 .so模組和Apache相連(具體來說是SAPI,即伺服器應用程式介面);
3. PHP總共有三個模組:核心、Zend引擎、以及擴充層;
4. PHP核心用來處理請求、文件流、錯誤處理等相關操作;
5. Zend引擎(ZE)用以將源文件轉換成機器語言,然後在虛擬機上運行它;
6. 擴展層是一組函數、類別庫和流,PHP使用它們來執行一些特定的操作。例如,我們需要mysql擴充來連接MySQL資料庫;
7. 當ZE執行程式時可能會需要連接若干擴展,這時ZE將控制權交給擴展,等處理完特定任務後再返還;
8. 最後,ZE將程式運行結果傳回PHP內核,它再將結果傳送給SAPI層,最後輸出到瀏覽器上。
3、PHP的開始和結束階段
開始階段有兩個過程:
第一個過程:apache啟動的過程,即在任何請求到達之前就發生。是在整個SAPI生命週期內(例如Apache啟動以後的整個生命週期內或者命令列程序整個執行過程中)的開始階段(MINIT),該階段只進行一次.。啟動Apache後,PHP解譯程式也隨之啟動; PHP呼叫各個擴充(模組)的MINIT方法,讓這些擴充切換到可用狀態。看看php.ini檔案裡打開了哪些擴充; MINIT的意思是「模組初始化」。各個模組都定義了一組函數、類別庫等用以處理其他請求。 模組在這個階段可以進行一些初始化工作,例如註冊常數, 定義模組使用的類別等等.典型的的模組回呼函數MINIT方法如下:
PHP_MINIT_FUNCTION(myphpextension) { /* Initialize functions, classes etc */ } { // 注册常量或者类等初始化操作 return SUCCESS; }
第二個程序發生在請求階段,當一個頁面請求發生時.則在每次請求之前都會進行初始化過程(RINIT請求開始).
請求到達之後,SAPI層將控制權交給PHP層,PHP初始化本次請求執行腳本所需的環境變數,例如建立一個執行環境,包括保存php運行過程中變數名稱和變數值內容的符號表. 以及目前所有的函數以及類別等資訊的符號表.例如是Session模組的RINIT,如果在php.ini中啟用了Session 模組,那在呼叫該模組的RINIT時就會初始化$_SESSION變量,並將相關內容讀入; 然後PHP會呼叫所有模組RINIT函數,即「請求初始化」。 在這個階段各個模組也可以執行一些相關的操作, 模組的RINIT函數和MINIT函數類似 ,RINIT方法可以看作是一個準備過程,在程式執行之間就會自動啟動。
PHP_RINIT_FUNCTION(myphpextension) { // 例如记录请求开始时间 // 随后在请求结束的时候记录结束时间.这样我们就能够记录下处理请求所花费的时间了 return SUCCESS; }
結束階段分為兩個環節:
請求處理完後就進入了結束階段, 一般腳本執行到末尾或者通過調用exit()或者die()函數,PHP都將進入結束階段. 和開始階段對應,結束階段也分為兩個環節,一個在請求結束後(RSHUWDOWN ),一個在SAPI生命週期結束時(MSHUTDOWN).
第一個環節:請求處理完後結束階段:請求處理完後就進入了結束階段,PHP就會啟動清理程式。它會依序呼叫各個模組的RSHUTDOWN方法。
RSHUTDOWN用於清除程式運行時所產生的符號表,也就是對每個變數呼叫unset函數。典型的RSHUTDOWN方法如下:
PHP_RSHUTDOWN_FUNCTION(myphpextension) { // 例如记录请求结束时间, 并把相应的信息写入到日至文件中. return SUCCESS; }
#第二個環節:最後,所有的請求都已處理完畢,SAPI也準備關閉了, PHP呼叫每個擴充的MSHUTDOWN方法,這是各個模組最後一次釋放記憶體的機會。 (這個是對於CGI和CLI等SAPI,沒有“下一個請求”,所以SAPI立刻開始關閉。 )
典型的RSHUTDOWN方法如下:
PHP_MSHUTDOWN_FUNCTION(extension_name) { /* Free handlers and persistent memory etc */ return SUCCESS; }
這樣,整個PHP生命週期就結束了。要注意的是,只有在伺服器沒有請求的情況下才會執行「啟動第一步」和「關閉第二步」。
SAPI運作PHP都經過以下幾個階段:
1、模組初始化階段(Module init) :
即為每個拓展原始碼中所呼叫的PHP_MINIT_FUNCTION中的方法初始化模組,進行一些模組所需變數的申請,記憶體分配等。
2、請求初始化階段(Request init) :
即接受至客戶端的請求後呼叫每個拓展的PHP_RINIT_FUNCS腳本中的執行方法,初始化每個拓展的執行方法,初始化每個拓展的執行方法環境。
3、執行PHP腳本
4、請求結束(Request Shutdown) :
請求結束(Request Shutdown)
: 每個拓展的PHP_RSHUTDOWN_FUNCTION方法清理請求現場,並且ZE開始回收變數和記憶體。 5、
關閉模組(Module shutdown)
:
Web伺服器與退出指令行腳本執行完碼#WN 命令拓展源中的方法拓展來源中的差分或退出指令行腳本執行完碼#H_MS #4.單一進程SAPI生命週期CLI/CGI模式的PHP屬於單一進程的SAPI模式。這類的請求在處理一次請求後就關閉。也就是只會經過以下幾個環節: 開始 - 請求開始 - 請求關閉 - 結束 SAPI介面實作就完成了其生命週期。所示:
被结束之后才会进行关闭阶段,在这两个阶段之间会随着每个请求重复请求开始-请求关闭的环节。
如图所示:
6、多线程的SAPI生命周期
多线程模式和多进程中的某个进程类似,不同的是在整个进程的生命周期内会并行的重复着 请求开始-请求关闭的环节.
在这种模式下,只有一个服务器进程在运行着,但会同时运行很多线程,这样可以减少一些资源开销,向Module init和Module shutdown就只需要运行一遍就行了,一些全局变量也只需要初始化一次,因为线程独具的特质,使得各个请求之间方便的共享一些数据成为可能。
多线程工作方式如下图
7、Apache一般使用多进程模式prefork
在linux下使用#http –l 命令可以查看当前使用的工作模式。也可以使用#apachectl -l命令。
看到的prefork.c,说明使用的prefork工作模式。
prefork 进程池模型,用在 UNIX 和类似的系统上比较多,主要是由于写起来方便,也容易移植,还不容易出问题。要知道,如果采用线程模型的话,用户线程、内核线程和混合型线程有不同的特性,移植起来就麻烦。prefork 模型,即预先 fork() 出来一些子进程缓冲一下,用一个锁来控制同步,连接到来了就放行一个子进程,让它去处理。
prefork MPM 使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:他能够使用那些没有处理好线程安全的第三方模块,并 且对于那些线程调试困难的平台而言,他也更容易调试一些。
以上是php底層之php生命週期詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHP用於構建動態網站,其核心功能包括:1.生成動態內容,通過與數據庫對接實時生成網頁;2.處理用戶交互和表單提交,驗證輸入並響應操作;3.管理會話和用戶認證,提供個性化體驗;4.優化性能和遵循最佳實踐,提升網站效率和安全性。

PHP在數據庫操作和服務器端邏輯處理中使用MySQLi和PDO擴展進行數據庫交互,並通過會話管理等功能處理服務器端邏輯。 1)使用MySQLi或PDO連接數據庫,執行SQL查詢。 2)通過會話管理等功能處理HTTP請求和用戶狀態。 3)使用事務確保數據庫操作的原子性。 4)防止SQL注入,使用異常處理和關閉連接來調試。 5)通過索引和緩存優化性能,編寫可讀性高的代碼並進行錯誤處理。

在PHP中使用預處理語句和PDO可以有效防範SQL注入攻擊。 1)使用PDO連接數據庫並設置錯誤模式。 2)通過prepare方法創建預處理語句,使用佔位符和execute方法傳遞數據。 3)處理查詢結果並確保代碼的安全性和性能。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP可以輕鬆創建互動網頁內容。 1)通過嵌入HTML動態生成內容,根據用戶輸入或數據庫數據實時展示。 2)處理表單提交並生成動態輸出,確保使用htmlspecialchars防XSS。 3)結合MySQL創建用戶註冊系統,使用password_hash和預處理語句增強安全性。掌握這些技巧將提升Web開發效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Dreamweaver Mac版
視覺化網頁開發工具

Dreamweaver CS6
視覺化網頁開發工具