什么SAPIFastCGI,PHP-FPM?學習PHP的必備知識

      網友投稿 895 2022-05-30

      一個月前,我想在阿里云 ECS 上部署一個 PHP 接口,發現服務器沒有配置 PHP-FPM,所以立刻搗鼓了下,沒想到是最后花了一小時才搞定,事后分析了下,就是太急躁了,沒有使用正確的方法解決問題。

      一個教訓:不管遇到任何事情,切記不能著急,仔細查閱文檔才是正道。

      廢話少說,趁著這次機會,我回顧了相關概念,即了解 Nginx、PHP-FPM 是如何協作的,介紹 PHP-FPM 和 PHP 之間的關系,SAPI 和 FastCGI 的區別,理解這些概念對于掌握 PHP 非常重要。

      后續我也會針對PHP-FPM的配置做一些簡單的分享,比如分析本次遇到的問題以及原因,大家可以持續關注。至于為什么不在一篇文章中全部寫完,主要考慮到干巴巴羅列知識點,效果可能會比較差,針對特定問題描述的話,讀者印象會更深刻。

      1:什么是 SAPI

      Server Application Programming Interface (SAPI) 是應用程序接口,對于 PHP 語言來說,它提供了很多 SAPI 接口,有了 SAPI,PHP 才有實際的用武之處。PHP 中最重要的 SAPI 是 PHP-FPM,提供給 Nginx Web 服務器使用,換句話說,有了應用語言的 SAPI,才能擴展 Web 服務器的功能。

      對于 PHP 來說,它有以下一些 SAPI,如圖:

      上圖就是 PHP5 相關的 SAPI,比較熟悉的就是 PHP-FPM,還有命令行的 php-cli,在 windows 下 SAPI 就是 php5apache2.dll。

      2:FastCGI

      對于 PHP-FPM 來說:

      實現了 PHP 解析器

      基于 FastCGI 協議,負責和 Web 服務器(Nginx、Apache)通信,那什么是 FastCGI?

      FastCGI is a binary protocol for interfacing interactive programs with a web server.

      那么我們來理解下 FastCGI 協議,簡單說來它就是 Web 服務器和應用(比如 PHP)之間的一個交互標準,一個二進制的協議,有了該協議,Nginx 和 PHP 之間就能夠互相通信了,FastCGI 是 CGI 協議的一個升級。

      光有 FastCGI 協議沒用,基于該協議,必須實現一個 SAPI 接口,PHP-FPM 就是一個 FastCGI 協議的實現,它能夠在一組關聯的請求中保持一個持久連接(同一個客戶請求由同一個 PHP-FPM 子進程處理),這個持久連接是由 PHP-FPM 處理的,而不是由 Web 服務器處理的。

      相比于 CGI 實現來說,FastCGI 實現能夠減少開銷,從而提升 Web 服務器的處理能力。

      一個 Web 請求如下圖:

      Nginx 服務器通過 FastCgi 協議,發送環境變量和 HTTP 數據給 PHP-FPM,Nginx 和 PHP-FPM 之間可以通過 Unix domain socket 和 TCP connection 通信。PHP-FPM 處理請求后,通過相同的連接返回數據給 Nginx。

      通過上圖也可以看出,Nginx 和 PHP-FPM 是互相隔離的,也是異步處理的,這也正是 Nginx 高效的原因,關于這方面可以通過一些專業文章去了解。Apache 最初使用 mod_php SAPI 處理請求(高度集成),這也是它緩慢的原因,但是現在 Apache 通過 FastCGI 協議也能和 PHP-FPM 通信了。

      3:PHP-FPM

      PHP-FPM (FastCGI Process Manager) is an alternative FastCGI implementation for PHP。

      PHP-FPM 剛才講了很多了,一方面它基于 FastCGI 協議實現了協議的功能,另外一方面它也集成了 PHP 解析器。

      什么是SAPI,FastCGI,PHP-FPM?學習PHP的必備知識

      PHP-FPM 由一個主進程和多個子進程組成,主進程復制與 Web 服務器通信,接收 HTTP 請求,然后分配給子進程處理,子進程主要動態執行 PHP 語言,處理完成后,最終返回給 Web 服務器。

      PHP-FPM 有很多優點,比如:

      能夠動態產生子進程(PHP解析器)。

      能夠平滑啟動子進程。

      有獨立的 php-fpm.conf 配置文件,它基于 php.ini 配置文件。

      fastcgi_finish_request() 功能支持,非常有用的特性。

      總之,一句話,對于大型的 PHP 網站來說,PHP-FPM 做了足夠多的優化。

      4:典型的 Nginx 和 PHP-FPM 配置

      安裝和啟動 PHP-FPM 很簡單,以 Ubuntu 服務器為例,運行如下命令即可:

      通過 Nginx 配置文件了解 Nginx 和 PHP-FPM 的交互細節:

      通過配置可以看出:

      Nginx 可以通過 9000 端口或本地 socket 文件和 PHP-FPM 交互。

      fastcgi_params 包含了很多 Web 服務器參數,比如 REMOTE_ADDR、QUERY_STRING 等等。

      最后看下 PHP-FPM 文件結構,如圖:

      conf.d:一些 php 通用擴展配置文件。(屬于 PHP 的部分)

      php.ini:PHP 核心配置文件。(屬于 PHP 的部分)

      php-fpm.conf:fpm 的主配置文件,主要是 PHP-FPM 主進程使用。

      pool.d:該目錄下加載的配置文件類似于 Web 服務器中的虛擬主機配置,由 PHP-FPM 子進程處理。

      關于 php-fpm.conf 和 pool.d 多說幾句:

      (1)php-fpm.conf 是 PHP-FPM 的主配置文件,都是全局性配置,但配置項較少,比如包含 pid、error_log、events.mechanism 等參數,理解起來很簡單。

      (2)pool.d 目錄可以包含多個虛擬主機配置文件,由 php-fpm.conf 負責加載。

      比如我一臺機器上 Nginx 配置了兩個虛擬主機,分別是 www.simplehttps.com 和 blog.simplehttps.com。這兩個虛擬主機可以加載不同的 PHP-FPM,比如 www.simplehttps.com-fpm.sock 和 blog.simplehttps.com-fpm.sock,那么這兩個 PHP-FPM 可以使用不同的配置文件(保存在 pool.d 目錄下),配置文件里面的參數可以自由調整,以后我會寫文章詳細介紹。

      【這篇文章發表于 2018-08-20,也可關注我的公眾號(ID:yudadanwx,虞大膽的嘰嘰喳喳】

      本文轉載自異步社區。

      Nginx 單片機 PHP

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:React Native之組件Component與PureComponent
      下一篇:剛剛,華為云數據庫收到十個來自靈魂的拷問
      相關文章
      亚洲欧洲日产国码在线观看| 亚洲国产成人VA在线观看 | 亚洲风情亚Aⅴ在线发布| 亚洲日本国产乱码va在线观看| 亚洲人成网站在线播放vr| 国产在亚洲线视频观看| 亚洲中文字幕无码爆乳app| 亚洲精品国产成人99久久| 国产成人高清亚洲| 亚洲日本中文字幕天堂网| 亚洲精品无码av中文字幕| 亚洲国产精品免费观看| 99热亚洲色精品国产88| 亚洲伊人久久大香线蕉啊| 亚洲成aⅴ人片在线影院八| 亚洲日本精品一区二区| 91亚洲精品第一综合不卡播放| 久久精品亚洲精品国产色婷| 久久久久亚洲Av无码专| 亚洲日本乱码一区二区在线二产线 | 亚洲娇小性色xxxx| 亚洲大香人伊一本线| 亚洲18在线天美| 亚洲日韩精品无码专区| 亚洲国产精品无码久久| 亚洲AV无码国产一区二区三区| 亚洲国产精品无码中文lv| 无码天堂va亚洲va在线va| 亚洲av色香蕉一区二区三区| 无码天堂亚洲国产AV| 亚洲人成网站色在线入口| 国产gv天堂亚洲国产gv刚刚碰 | 亚洲成a人片7777| 亚洲一卡2卡3卡4卡乱码 在线| 亚洲中文字幕无码久久2020| 亚洲狠狠婷婷综合久久| 国产AV日韩A∨亚洲AV电影| 国产精品亚洲产品一区二区三区| 狠狠亚洲狠狠欧洲2019| 久久精品国产亚洲av成人| 亚洲网站视频在线观看|