這篇文章主要介紹了關於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-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程式的架構和執行流程,並對幾個容易混淆概念做了介紹。
感謝閱讀,歡迎指正!
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!
相關推薦:
以上是PHP的執行流程及相關概念的詳細內容。更多資訊請關注PHP中文網其他相關文章!