PHP回顧之執行流程及相關概念

轉載請註明文章出處: https://tlanyan.me/php-review...

PHP回顧系列目錄

本文總結PHP的執行流程以及相關概念。php

程序架構

先看看運行一個PHP程序須要哪些支撐。一切的起點,要從程序員開始寫PHP纔有意義,因此應用層面的PHP腳本文件(包括Composer/include的各類第三方PHP代碼)是必須的。腳本文件要解析編譯後才能執行,因此PHP虛擬機(一般是Zend引擎)也是必備的。此外PHP腳本中會使用多個拓展中的函數和類,因此拓展(包括官方、PECL、以及用戶自行寫的拓展)幾乎也是必備的。另外PHP程序要與外部交互(例如從命令行獲取參數、從web服務器獲取請求信息),這一層由SAPI負責,因此SAPI也是必須的。程序員

總結以上,PHP程序的架構從上往下看有四層,分別是:應用層、SAPI層、拓展層和Zend引擎。架構關係見下圖:web

PHP程序架構

(圖片來源:http://www.nowamagic.net/libr...數據庫

SAPI層對某些人可能相對陌生。SAPI提供一套統一的接口,讓上層應用程序與實際運行環境解耦。用戶寫的PHP文件,能夠用命令行執行,也能夠在Apache httpd或FPM中執行。背後的支持工做由SAPI提供,開發人員無感知。經過SAPI,PHP腳本層無需過多考慮執行的具體環境,而PHP自己則可讓SAPI針對本身的特色給出特有實現。apache

執行流程

拋開各個SAPI實現上的差別,PHP程序的執行流程能夠簡單歸結以下:編程

  1. 程序啓動,Zend引擎和核心組件初始化;
  2. 拓展初始化(MINIT);
  3. 收到請求,拓展激活(RINIT);
  4. 解析、執行PHP腳本;
  5. 請求結束,拓展停用(RSHUTDOWN);
  6. 卸載拓展(MSHUTDOWN);
  7. 程序關閉

除345,其他幾步在整個SAPI生命週期中只會執行一次。CGI/CLI模式下,345也只執行一次。安全

理解PHP程序的生命週期,是PHP進階的必備過程,也能幫助開發人員快速定位問題。例如腳本報函數不存在,頗有多是某個拓展缺失或加載出錯;在CLI/CGI模式下,再怎麼pconnect也是徒勞的,腳本一執行完資源就釋放掉;exit/die終止的是腳本的執行,不必定意味着進程的結束;腳本編譯後常駐內存,不會反覆執行RINIT和RSHUTDOWN,是CLI框架相對於其餘運行模式的性能提高點;等等。服務器

SAPI生命週期中各個階段的更多細節,請參考《深刻理解PHP內核》一書。cookie

CGI、FastCGI、PHP-FPM等

CGI/FastCGI/php-cgi和PHP-FPM是幾個容易讓PHP開發人員困惑和混淆的概念。這幾個概念的關係以下:session

CGI/FastCGI:網關協議,與語言無關,因此與PHP關係也不大。二者的區別是FastCGI能夠獨立於web服務器,運行FastCGI協議的程序變成web服務器的內容提供方(上游)。另外與web服務器解耦後,用FastCGI協議交互的進程具備性能好、安全穩定、支持分佈式等優勢;

php-cgi:實現FastCGI協議的PHP解析器,不能平滑重啓和熱加載;

FPM:PHP官方的FastCGI進程管理器,可執行程序爲php-fpm;支持平滑重啓、熱加載,運行穩定;其管理對象不是php-cgi進程,二者沒什麼關係。

僅是幾個概念比較容易容易區分,實際上混淆開發人員的是如下四組概念的綜合:

  1. web服務器。常見的Apache httpd和Nginx;
  2. SAPI。常見的是apache2handler、cli、fpm-fcgi;
  3. 協議。文中提到的CGI和FastCGI;
  4. 程序。即php-cgi和php-fpm。

因爲web服務器對大多數人更熟悉,拿之說一下與其餘概念的關係:使用Apache httpd時,90%以上的狀況以模塊方式執行PHP腳本,因此與SAPI中的apache2handler有關,與其餘概念無關(既不是CGI也不是FastCGI協議);使用Nginx時,90%的狀況是經過FastCGI協議將請求轉發到FPM,因此與SAPI中的fpm-fcgi、協議中的FastCGI、程序中的php-fpm三個概念有關,與其餘概念無關。

總結

本文簡要回顧了PHP程序的架構和執行流程,並對幾個容易混淆概念作了介紹。

感謝閱讀,歡迎指正!

參考

  1. http://www.php-internals.com/...
  2. http://www.nowamagic.net/libr...
  3. http://cuishan.win/2017/02/05...
  4. http://www.mike.org.cn/articl...
  5. https://www.kancloud.cn/nickb...
  6. http://php.net/manual/en/inst...
相關文章
相關標籤/搜索