日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

深入理解php底層之php生命周期

瀏覽:33日期:2022-09-07 18:51:09
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接口進行的. 

啟動apache

當給定的SAPI啟動時,例如在對/usr/local/apache/bin/apachectl start的響應中,PHP由初始化其內核子系統開始。在接近啟動例程的末尾,它加載每個擴展的代碼并調用其模塊初始化例程(MINIT)。這使得每個擴展可以初始化內部變量、分配資源、注冊資源處理器,以及向ZE注冊自己的函數,以便于腳本調用這其中的函數時候ZE知道執行哪些代碼。

請求處理初始化

接下來,PHP等待SAPI層請求要處理的頁面。對于CGI或CLI等SAPI,這將立刻發生且只發生一次。對于Apache、IIS或其他成熟的web服務器SAPI,每次遠程用戶請求頁面時都將發生,因此重復很多次,也可能并發。不管請求如何產生,PHP開始于要求ZE建立腳本的運行環境,然后調用每個擴展的請求初始化 (RINIT)函數。RINIT使得擴展有機會設定特定的環境變量,根據請求分配資源,或者執行其他任務,如審核。 session擴展中有個RINIT作用的典型示例,如果啟用了session.auto_start選項,RINIT將自動觸發用戶空間的session_start()函數以及預組裝$_SESSION變量。

執行php代碼

一旦請求被初始化了,ZE開始接管控制權,將PHP腳本翻譯成符號,最終形成操作碼并逐步運行之。如任一操作碼需要調用擴展的函數,ZE將會把參數綁定到該函數,并且臨時交出控制權直到函數運行結束。

腳本結束

腳本運行結束后,PHP調用每個擴展的請求關閉(RSHUTDOWN)函數以執行最后的清理工作(如將session變量存入磁盤)。接下來,ZE執行清理過程(垃圾收集)-有效地對之前的請求期間用到的每個變量執行unset()。

sapi關閉

一旦完成,PHP繼續等待SAPI的其他文檔請求或者是關閉信號。對于CGI和CLI等SAPI,沒有“下一個請求”,所以SAPI立刻開始關閉。關閉期間,PHP再次遍歷每個擴展,調用其模塊關閉(MSHUTDOWN)函數,并最終關閉自己的內核子系統。

簡要的過程如下:

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層,最終輸出到瀏覽器上。

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_FUNCTION中的方法,初始化PHP腳本的執行環境。3、執行PHP腳本4、請求結束(Request Shutdown) :這時候調用每個拓展的PHP_RSHUTDOWN_FUNCTION方法清理請求現場,并且ZE開始回收變量和內存。5、關閉模塊(Module shutdown)     :Web服務器退出或者命令行腳本執行完畢退出會調用拓展源碼中的PHP_MSHUTDOWN_FUNCTION 方法

4、單進程SAPI生命周期

CLI/CGI模式的PHP屬于單進程的SAPI模式。這類的請求在處理一次請求后就關閉。也就是只會經過如下幾個環節: 開始 - 請求開始 - 請求關閉 - 結束 SAPI接口實現就完成了其生命周期。如圖所示:

深入理解php底層之php生命周期

5、多進程SAPI生命周期

通常PHP是編譯為apache的一個模塊來處理PHP請求。Apache一般會采用多進程模式, Apache啟動后會

fork出多個子進程,每個進程的內存空間獨立,每個子進程都會經過開始和結束環節, 不過每個進程的開始階

段只在進程fork出來以來后進行,在整個進程的生命周期內可能會處理多個請求。 只有在Apache關閉或者進程

被結束之后才會進行關閉階段,在這兩個階段之間會隨著每個請求重復請求開始-請求關閉的環節。 

如圖所示:

深入理解php底層之php生命周期

6、多線程的SAPI生命周期

多線程模式和多進程中的某個進程類似,不同的是在整個進程的生命周期內會并行的重復著 請求開始-請求關閉的環節

在這種模式下,只有一個服務器進程在運行著,但會同時運行很多線程,這樣可以減少一些資源開銷,向Module init和Module shutdown就只需要運行一遍就行了,一些全局變量也只需要初始化一次,因為線程獨具的特質,使得各個請求之間方便的共享一些數據成為可能。

 多線程工作方式如下圖

深入理解php底層之php生命周期

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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
五月婷婷六月综合| 亚洲涩涩av| 国产福利一区二区三区在线播放| 亚久久调教视频| 亚洲一级淫片| 日本一区二区三区视频在线看| 青草综合视频| 国产亚洲欧美日韩精品一区二区三区| 国产欧美一区二区色老头| 亚洲精品日本| 91精品国产自产观看在线| 久久国产日韩欧美精品| 麻豆中文一区二区| 国产一区二区三区国产精品| 日韩国产欧美| 亚洲福利免费| 蜜桃视频一区二区三区在线观看| 免费在线看一区| 日韩精品欧美精品| 国产欧美一区二区精品久久久| 国产精品1区在线| 高清av不卡| 免费精品国产的网站免费观看| 欧美日韩精品免费观看视频完整| 在线日韩中文| 免费久久99精品国产| 日韩国产91| 精品理论电影在线| 亚洲视频综合| 日韩手机在线| 国产a亚洲精品| 韩日一区二区三区| 亚洲欧洲日韩| 欧美黄色一区| 精精国产xxxx视频在线野外| 亚洲一区二区三区免费在线观看| 日本不卡一二三区黄网| 精品国产美女a久久9999| 四虎4545www国产精品 | 视频在线观看91| 日本va欧美va精品| 久久男人av资源站| 久久xxxx精品视频| 国产黄色一区| 激情欧美亚洲| 国产精品一页| 欧美特黄一级大片| 日韩不卡一区二区三区| 在线看片福利| 色综合视频一区二区三区日韩 | 国产欧美高清| 国产一在线精品一区在线观看| 亚洲免费毛片| 亚洲黄色网址| 亚洲精品系列| 四虎8848精品成人免费网站| 亚洲欧美久久久| 国产成人精品一区二区三区视频| 9国产精品视频| 国产一区二区三区四区五区| 亚洲专区在线| 国产成人免费精品| 日本亚洲视频| 亚洲福利国产| 激情不卡一区二区三区视频在线| 日韩中文字幕1| 亚洲午夜天堂| 日本午夜精品一区二区三区电影 | 中文字幕系列一区| 日韩国产欧美一区二区三区| 91精品一区国产高清在线gif| 91福利精品在线观看| 极品日韩av| 精品视频网站| 日本一区二区三区中文字幕| 亚洲a在线视频| 久草精品视频| 亚洲区欧美区| 午夜精品一区二区三区国产| 韩日一区二区| 91成人在线| 亚洲在线国产日韩欧美| 日本在线精品| 日韩av二区| 久久激五月天综合精品| 久久xxxx精品视频| 激情欧美一区| 黑人精品一区| 国内一区二区三区| 国产欧美午夜| 日本成人中文字幕在线视频| 国产一级久久| 国户精品久久久久久久久久久不卡| 欧美精品91| 欧美亚洲三区| 日本成人中文字幕| 天堂va在线高清一区| 香蕉视频成人在线观看| 91成人精品视频| 中文字幕人成乱码在线观看 | 久久影院一区二区三区| 日韩欧美中文字幕电影| 亚洲欧美日韩国产一区| 亚洲国产一区二区三区在线播放 | 亚洲综合国产| 99在线|亚洲一区二区| 激情偷拍久久| 日韩视频网站在线观看| 国产一区二区三区久久| 精品在线网站观看| 久久一区精品| 久久影院一区二区三区| 麻豆国产精品视频| 久久不见久久见中文字幕免费 | 免费国产亚洲视频| 亚洲综合国产| 免费人成在线不卡| 蜜臀久久久久久久| 日韩成人综合| 欧美男人天堂| 日韩精品dvd| 欧洲av一区二区| 亚洲h色精品| 亚洲国产成人精品女人| 伊人久久亚洲美女图片| 国产婷婷精品| 亚洲人成亚洲精品| 日韩av在线播放中文字幕| 日韩免费精品| 国产日韩三级| 国产精品www.| 国产一区二区三区四区| av资源新版天堂在线| 超碰在线99| 久久婷婷av| 亚洲成人日韩| 丝袜国产日韩另类美女| 亚洲精品乱码| 日韩高清一区在线| 久久狠狠久久| 成人国产精品| 久久精品电影| 日韩影院免费视频| 国产亚洲精品精品国产亚洲综合| 麻豆成人综合网| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 免费视频久久| 日韩视频一二区| 久久精品一区| 久久久久久美女精品| 亚洲色诱最新| 久久国产视频网| 国产精品精品| 午夜国产欧美理论在线播放 | 在线亚洲国产精品网站| 亚洲字幕久久| 国产欧美高清| 欧美在线观看视频一区| 免费久久99精品国产| 国产精品日韩精品中文字幕| 97精品一区| 久久国产精品久久久久久电车| 欧美一区激情| 视频二区不卡| 亚洲乱码一区| 丰满少妇一区| 麻豆久久精品| 国产精品jk白丝蜜臀av小说| 91精品一区二区三区综合在线爱 | 亚洲欧美日韩一区在线观看| 91成人精品观看| 亚洲伦乱视频| 日本成人精品| 999国产精品视频| 日韩激情啪啪| 欧美日韩在线播放视频| 日韩精品五月天| 日产精品一区| 日韩av午夜在线观看| 日韩免费高清| 婷婷亚洲成人| 色综合五月天| 亚洲欧美久久精品| 日本精品不卡| 国产欧美日韩在线观看视频| 久久精品中文| 国产日韩欧美三级| 欧美在线资源| 精品中国亚洲| 亚洲理论在线| 久久国产中文字幕| 久久99蜜桃| 国产农村妇女精品一区二区 | 国产精品视频一区二区三区综合| 三上悠亚国产精品一区二区三区| 日韩在线观看中文字幕| 999国产精品| 久久69成人| 亚洲+小说+欧美+激情+另类| 亚洲成人国产|