目錄
PHP運行方式
常見的運行方式
CGI (早期的web服務(wù)器)
Web服務(wù)器(nginx/Apache)只能處理靜態(tài)文件請求帜消、一旦碰到動態(tài)腳本請求尝盼,Web 服務(wù)器就會 Fork 進程來啟動 CGI 程序,將動態(tài)腳本交給 CGI程序來處理。
- 瀏覽器發(fā)送鏈接請求(GET POST ...)
- Web服務(wù)器解析請求
- 開啟一個進程執(zhí)行CGI程序(初始化配置文件、加載模塊)
- 數(shù)據(jù)傳輸
- 環(huán)境變量(ENV)
- 當服務(wù)器守護進程創(chuàng)建子進程運行CGI程序時,設(shè)置相應(yīng)的環(huán)境變量和命令行參數(shù)酥艳,以傳遞客戶端和服務(wù)器的有關(guān)信息給該子進程。
- 命令行
- 命令行參數(shù)僅在有HTML文檔中有SINDEX查詢的情況下使用
- 標準輸入(STDIN)\標準輸出(STDOUT)
- 當HTTP請求模式采用POST方式時爬骤,CGI程序通過標準輸入流和有關(guān)環(huán)境變量來獲取客戶端傳輸數(shù)據(jù)充石;如采用GET方式時,CGI程序直接通過環(huán)境變量獲取客戶端傳輸數(shù)據(jù)盖腕。當CGI程序要返回處理結(jié)果(一般為HTML文檔)給客戶端時赫冬,它通過標準輸出流將該結(jié)果數(shù)據(jù)傳遞給服務(wù)器守護進程。
- 環(huán)境變量(ENV)
- 數(shù)據(jù)傳輸
- CGI把處理的響應(yīng)通過標準輸出回傳給 Web 服務(wù)器
- Web 服務(wù)器響應(yīng)給瀏覽器溃列、關(guān)閉鏈接
php 的 Cgi解釋器就是
/usr/local/Cellar/php/7.3.9/bin/php-cgi
FastCgi(現(xiàn)在的Web服務(wù)器)
Cgi 的改進版劲厌、由于每處理一個請求都要反復(fù)的加載CGI程序造成性能底下!
Fastcgi會先啟一個master听隐,解析配置文件补鼻,初始化執(zhí)行環(huán)境,然后再啟動多個worker。當請求過來時风范,master會傳遞給一個worker咨跌,然后立即可以接受下一個請求。這樣就避免了重復(fù)的勞動硼婿,效率自然是高锌半。而且當worker不夠用時,master可以根據(jù)配置預(yù)先啟動幾個worker等著寇漫;當然空閑worker太多時刊殉,也會停掉一些,這樣就提高了性能州胳,也節(jié)約了資源记焊。
Cli
終端運行 php 腳本. shell> php -a
WebModule
Apache phpModule
PHP生命周期
php-deadline
其中 【模塊初始】為啟動 php-fpm 發(fā)生的
【請求初始】、【代碼執(zhí)行】栓撞、【請求結(jié)束】 為處理請求發(fā)生的
【模塊關(guān)閉】為關(guān)閉 php-fpm 發(fā)生的
各個生命周期啟動時的一些操作說明
- 模塊初始 (php_module_startup() )
本階段主要進行php框架遍膜、Zend引擎的初始化操作,比如啟動zend引擎瓤湘、解析php.ini瓢颅、將php.ini中配置的擴展加載到php中,注冊php.ini中禁用的函數(shù)弛说、類:disable_functions惜索、disable_classes,等剃浇。
- 請求初始 (php_request_startup())
該階段是在請求處理前每個請求都會經(jīng)歷的一個階段,對于Fpm而言猎物,實在worker進程中accept一個請求并讀取虎囚、解析完請求數(shù)據(jù)后的一個階段。
主要完成以下幾個操作:
激活輸出:php_output_activate()蔫磨。
初始化編譯器淘讥、執(zhí)行器、重置垃圾回收器堤如、初始化全局變量符號表蒲列。
- 代碼執(zhí)行 (php_execute_script())
該階段包括php代碼的編譯、執(zhí)行兩個核心階段搀罢,這也是Zend引擎最重要的功能蝗岖。
- 請求結(jié)束 (php_request_shutdown()) 請求初始 的逆反操作
與請求初始化階段相反,此階段將flush輸出內(nèi)容榔至、發(fā)送header頭抵赢、清理全局變量、關(guān)閉編譯器、關(guān)閉執(zhí)行器等
B的逆反操作
- 模塊關(guān)閉 (php_module_shutdown()) 模塊初始 的逆反操作
與模塊初始化階段相反铅鲤,次階段將清理資源划提、各php模塊關(guān)閉等操作。