摘要:通過,腳本層無需過多考慮執行的具體環境,而本身則可以讓針對自己的特點給出特有實現。模式下,也只執行一次。這幾個概念的關系如下網關協議,與語言無關,所以與關系也不大。總結本文簡要回顧了程序的架構和執行流程,并對幾個容易混淆概念做了介紹。
轉載請注明文章出處:https://tlanyan.me/php-review...PHP回顧系列目錄
PHP基礎
web請求
cookie
web響應
session
數據庫操作
加解密
Composer
創建自己的Composer包
發送郵件
IO
流
Socket編程
多進程編程
本文總結PHP的執行流程以及相關概念。
程序架構先看看運行一個PHP程序需要哪些支撐。一切的起點,要從程序員開始寫PHP才有意義,所以應用層面的PHP腳本文件(包括Composer/include的各種第三方PHP代碼)是必須的。腳本文件要解析編譯后才能執行,所以PHP虛擬機(通常是Zend引擎)也是必備的。此外PHP腳本中會使用多個拓展中的函數和類,所以拓展(包括官方、PECL、以及用戶自行寫的拓展)幾乎也是必備的。另外PHP程序要與外部交互(例如從命令行獲取參數、從web服務器獲取請求信息),這一層由SAPI負責,所以SAPI也是必須的。
總結以上,PHP程序的架構從上往下看有四層,分別是:應用層、SAPI層、拓展層和Zend引擎。架構關系見下圖:
(圖片來源:http://www.nowamagic.net/libr...)
SAPI層對某些人可能相對陌生。SAPI提供一套統一的接口,讓上層應用程序與實際運行環境解耦。用戶寫的PHP文件,可以用命令行執行,也可以在Apache httpd或FPM中執行。背后的支持工作由SAPI提供,開發人員無感知。通過SAPI,PHP腳本層無需過多考慮執行的具體環境,而PHP本身則可以讓SAPI針對自己的特點給出特有實現。
執行流程拋開各個SAPI實現上的差異,PHP程序的執行流程可以簡單歸結如下:
程序啟動,Zend引擎和核心組件初始化;
拓展初始化(MINIT);
收到請求,拓展激活(RINIT);
解析、執行PHP腳本;
請求結束,拓展停用(RSHUTDOWN);
卸載拓展(MSHUTDOWN);
程序關閉
除345,其余幾步在整個SAPI生命周期中只會執行一次。CGI/CLI模式下,345也只執行一次。
理解PHP程序的生命周期,是PHP進階的必備過程,也能幫助開發人員快速定位問題。例如腳本報函數不存在,很有可能是某個拓展缺失或加載出錯;在CLI/CGI模式下,再怎么pconnect也是徒勞的,腳本一執行完資源就釋放掉;exit/die終止的是腳本的執行,不一定意味著進程的結束;腳本編譯后常駐內存,不會反復執行RINIT和RSHUTDOWN,是CLI框架相對于其他運行模式的性能提升點;等等。
SAPI生命周期中各個階段的更多細節,請參考《深入理解PHP內核》一書。
CGI、FastCGI、PHP-FPM等CGI/FastCGI/php-cgi和PHP-FPM是幾個容易讓PHP開發人員困惑和混淆的概念。這幾個概念的關系如下:
CGI/FastCGI:網關協議,與語言無關,所以與PHP關系也不大。兩者的區別是FastCGI可以獨立于web服務器,運行FastCGI協議的程序變成web服務器的內容提供方(上游)。另外與web服務器解耦后,用FastCGI協議交互的進程具有性能好、安全穩定、支持分布式等優點; php-cgi:實現FastCGI協議的PHP解析器,不能平滑重啟和熱加載; FPM:PHP官方的FastCGI進程管理器,可執行程序為php-fpm;支持平滑重啟、熱加載,運行穩定;其管理對象不是php-cgi進程,兩者沒什么關系。
僅是幾個概念比較容易容易區分,實際上混淆開發人員的是以下四組概念的綜合:
web服務器。常見的Apache httpd和Nginx;
SAPI。常見的是apache2handler、cli、fpm-fcgi;
協議。文中提到的CGI和FastCGI;
程序。即php-cgi和php-fpm。
由于web服務器對大多數人更熟悉,拿之說一下與其他概念的關系:使用Apache httpd時,90%以上的情況以模塊方式執行PHP腳本,所以與SAPI中的apache2handler有關,與其他概念無關(既不是CGI也不是FastCGI協議);使用Nginx時,90%的情況是通過FastCGI協議將請求轉發到FPM,所以與SAPI中的fpm-fcgi、協議中的FastCGI、程序中的php-fpm三個概念有關,與其他概念無關。
總結本文簡要回顧了PHP程序的架構和執行流程,并對幾個容易混淆概念做了介紹。
感謝閱讀,歡迎指正!
參考http://www.php-internals.com/...
http://www.nowamagic.net/libr...
http://cuishan.win/2017/02/05...
http://www.mike.org.cn/articl...
https://www.kancloud.cn/nickb...
http://php.net/manual/en/inst...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28942.html
摘要:想要更好的利用協同工作,學會創建自己的包是一項必不可少的技能。編輯項目的或,增加一項配置,例如以上配置使用中國全量鏡像網站作為默認中央倉庫。創建自己的包創建一個包只需兩步填寫包描述信息寫代碼。通過簡單兩步,我們創建的自己的包。 轉載請注明文章出處:https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎 web請求 cookie web響應 ...
摘要:隨著云服務器的盛行,幾乎無法以指向本機的域名向外發送郵件,除了在本機內發送提醒郵件,用處已然不大。發送效率低非面向對象的調用方式,配置麻煩以及云服務器廠商的封鎖,是使用函數的最大阻礙。 轉載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎 web請求 cookie web響應 session 數據庫操作 加解密 Co...
摘要:今年從北京站開始,分享主題與后端相關。嘉賓匯總高馳濤性能之路姜季廷的前后之道孫宏亮生態中的現狀與實踐信海龍異步化探索今年還會在其他九個城市巡回分享,感謝大家的關注與分享。 今年 SegmentFault D-Day 從北京站開始,分享主題與「后端」相關。當然,我們還會在其他九個城市巡回分享,歡迎大家關注,幫忙擴散。 開場介紹 首先是 youku 美女星宇對 SegmentFault 社...
摘要:今年從北京站開始,分享主題與后端相關。嘉賓匯總高馳濤性能之路姜季廷的前后之道孫宏亮生態中的現狀與實踐信海龍異步化探索今年還會在其他九個城市巡回分享,感謝大家的關注與分享。 今年 SegmentFault D-Day 從北京站開始,分享主題與「后端」相關。當然,我們還會在其他九個城市巡回分享,歡迎大家關注,幫忙擴散。 開場介紹 首先是 youku 美女星宇對 SegmentFault 社...
閱讀 3065·2023-04-25 18:54
閱讀 2591·2021-11-02 14:40
閱讀 3176·2021-09-23 11:58
閱讀 2424·2019-08-30 13:50
閱讀 1230·2019-08-29 12:46
閱讀 3117·2019-08-28 17:51
閱讀 678·2019-08-26 11:47
閱讀 897·2019-08-23 16:17