摘要:的工作原理和生命周期是一門(mén)適用于開(kāi)發(fā)的動(dòng)態(tài)語(yǔ)言,它可以說(shuō)是一個(gè)用語(yǔ)言實(shí)現(xiàn)的包含大量組件的軟件框架。無(wú)論是哪種公眾模式,的工作原理都是一樣的,都是作為一種運(yùn)行。
PHP的工作原理和生命周期
php是一門(mén)適用于web開(kāi)發(fā)的動(dòng)態(tài)語(yǔ)言,它可以說(shuō)是一個(gè)用C語(yǔ)言實(shí)現(xiàn)的包含大量組件的軟件框架。那么,php是如何工作的呢?它的生命周期是怎么樣的呢?
php是以請(qǐng)求/響應(yīng)為周期運(yùn)行服務(wù)端應(yīng)用程序,當(dāng)請(qǐng)求進(jìn)入應(yīng)用程序,流程如下:
php的每一個(gè)請(qǐng)求都會(huì)重復(fù)以上的交互。
php的運(yùn)行模式有兩種:web模式和cli模式。無(wú)論是哪種公眾模式,php的工作原理都是一樣的,都是作為一種SAPI運(yùn)行。首先,認(rèn)識(shí)下SAPI,它是什么?
Sapi全稱(chēng)是Server Application Programming Interface,也就是服務(wù)端應(yīng)用編程接口,Sapi通過(guò)一系列鉤子函數(shù),使得PHP可以和外圍交互數(shù)據(jù),這是PHP非常優(yōu)雅和成功的一個(gè)設(shè)計(jì),通過(guò)sapi成功的將PHP本身和上層應(yīng)用解耦隔離,PHP可以不再考慮如何針對(duì)不同應(yīng)用進(jìn)行兼容,而應(yīng)用本身也可以針對(duì)自己的特點(diǎn)實(shí)現(xiàn)不同的處理方式。
常見(jiàn)的SAPI有cli、cgi、php-fpm以及各服務(wù)具體的sapi。
在php的生命周期中,有4個(gè)關(guān)鍵調(diào)用:
以nginx服務(wù)器為例,在web模式下,生命周期流程如下:
SAPI運(yùn)行PHP都經(jīng)過(guò)下面幾個(gè)階段:
1、模塊初始化階段(module init):
這個(gè)階段主要進(jìn)行php框架、zend引擎的初始化操作。這個(gè)階段一般是在SAPI啟動(dòng)時(shí)執(zhí)行一次,對(duì)于FPM而言,就是在fpm的master進(jìn)行啟動(dòng)時(shí)執(zhí)行的。php加載每個(gè)擴(kuò)展的代碼并調(diào)用其模塊初始化例程(MINIT),進(jìn)行一些模塊所需變量的申請(qǐng),內(nèi)存分配等。
2、請(qǐng)求初始化階段(request init):
當(dāng)一個(gè)頁(yè)面請(qǐng)求發(fā)生時(shí),在請(qǐng)求處理前都會(huì)經(jīng)歷的一個(gè)階段。對(duì)于fpm而言,是在worker進(jìn)程accept一個(gè)請(qǐng)求并讀取、解析完請(qǐng)求數(shù)據(jù)后的一個(gè)階段。在這個(gè)階段內(nèi),SAPI層將控制權(quán)交給PHP層,PHP初始化本次請(qǐng)求執(zhí)行腳本所需的環(huán)境變量。
3、php腳本執(zhí)行階段
php代碼解析執(zhí)行的過(guò)程。Zend引擎接管控制權(quán),將php腳本代碼編譯成opcodes并順次執(zhí)行
4、請(qǐng)求結(jié)束階段(request shutdown):
請(qǐng)求處理完后就進(jìn)入了結(jié)束階段,PHP就會(huì)啟動(dòng)清理程序。這個(gè)階段,將flush輸出內(nèi)容、發(fā)送http響應(yīng)內(nèi)容等,然后它會(huì)按順序調(diào)用各個(gè)模塊的RSHUTDOWN方法。 RSHUTDOWN用以清除程序運(yùn)行時(shí)產(chǎn)生的符號(hào)表,也就是對(duì)每個(gè)變量調(diào)用unset函數(shù)。
5、模塊關(guān)閉階段(module shutdown):
該階段在SAPI關(guān)閉時(shí)執(zhí)行,與模塊初始化階段對(duì)應(yīng),這個(gè)階段主要是進(jìn)行資源的清理、php各模塊的關(guān)閉操作,同時(shí),將回調(diào)各擴(kuò)展的module shutdown鉤子函數(shù)。這是發(fā)生在所有請(qǐng)求都已經(jīng)結(jié)束之后,例如關(guān)閉fpm的操作。(這個(gè)是對(duì)于CGI和CLI等SAPI,沒(méi)有“下一個(gè)請(qǐng)求”,所以SAPI立刻開(kāi)始關(guān)閉。)
截圖于:PHP底層的運(yùn)行機(jī)制與原理
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28541.html
摘要:應(yīng)用實(shí)例所依賴(lài)的服務(wù)提供者可以在配置文件中的節(jié)點(diǎn)找到。完成所有服務(wù)提供者注冊(cè)到應(yīng)用實(shí)例后,應(yīng)用實(shí)例執(zhí)行啟動(dòng)方法引導(dǎo)項(xiàng)目啟動(dòng)。或內(nèi)核接收到請(qǐng)求,加載服務(wù)提供者,同時(shí),將請(qǐng)求分發(fā)給路由器執(zhí)行。 這是一篇翻譯文章,原文 Request Life Cycle of Laravel,譯文 Laravel 請(qǐng)求生命周期 首發(fā)于個(gè)人博客,轉(zhuǎn)載請(qǐng)注明出處。 當(dāng)需要使用一個(gè)框架、工具或者服務(wù)時(shí),在使用前...
摘要:的作用就是為了解決協(xié)議無(wú)狀態(tài)的缺陷所作的努力。的內(nèi)容主要包括名字,值,過(guò)期時(shí)間,路徑和域。這種生命期為瀏覽器會(huì)話(huà)期的被稱(chēng)為會(huì)話(huà)。而機(jī)制采用的是一種在服務(wù)器端保持狀態(tài)的解決方案。中的有效期默認(rèn)分鐘,也就是說(shuō),客戶(hù)端超過(guò)分鐘,當(dāng)前就會(huì)失效。 會(huì)話(huà)控制是什么? cookie和session都是跟蹤整個(gè)會(huì)話(huà)過(guò)程的技術(shù)手段。而會(huì)話(huà),就是用戶(hù)通過(guò)瀏覽器和服務(wù)器的一次通話(huà)。 為什么要有會(huì)話(huà)控制? 因...
摘要:將環(huán)境變量和標(biāo)準(zhǔn)輸入發(fā)送到子進(jìn)程子進(jìn)程完成處理后將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息從同一連接返回。當(dāng)子進(jìn)程關(guān)閉連接時(shí),請(qǐng)求便告知處理完成。定義一個(gè)子進(jìn)程最多處理的請(qǐng)求數(shù),達(dá)到這個(gè)值,進(jìn)程自動(dòng)退出。 一、SAPI比較 1. SAPI 服務(wù)器應(yīng)用程序編程接口,就是服務(wù)器與編程語(yǔ)言之間交互的接口。比如Linux命令行執(zhí)行一段PHP代碼,其實(shí)是Linux shell通過(guò)PHP SAPI傳入一組參數(shù),zend...
閱讀 3790·2021-09-22 15:17
閱讀 1976·2021-09-22 14:59
閱讀 2377·2020-12-03 17:00
閱讀 3244·2019-08-30 15:55
閱讀 522·2019-08-30 11:23
閱讀 3520·2019-08-29 13:56
閱讀 546·2019-08-29 12:54
閱讀 2275·2019-08-29 12:49