什么是SAPI,F(xiàn)astCGI兰伤,PHP-FPM内颗?學(xué)習(xí)PHP的必備知識

【歡迎關(guān)注我的微信(yudadanwx,和我簡書的昵稱相同)】

一個月前敦腔,我想在阿里云 ECS 上部署一個 PHP 接口均澳,發(fā)現(xiàn)服務(wù)器沒有配置 PHP-FPM,所以立刻搗鼓了下符衔,沒想到是最后花了一小時才搞定找前,事后分析了下颂碘,就是太急躁了乓诽,沒有使用正確的方法解決問題。

一個教訓(xùn):不管遇到任何事情脉漏,切記不能著急五嫂,仔細查閱文檔才是正道颗品。

廢話少說,趁著這次機會沃缘,我回顧了相關(guān)概念躯枢,即了解 Nginx、PHP-FPM 是如何協(xié)作的槐臀,介紹 PHP-FPM 和 PHP 之間的關(guān)系锄蹂,SAPI 和 FastCGI 的區(qū)別,理解這些概念對于掌握 PHP 非常重要水慨。

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

1:什么是 SAPI

Server Application Programming Interface (SAPI) 是應(yīng)用程序接口,對于 PHP 語言來說侮邀,它提供了很多 SAPI 接口坏怪,有了 SAPI,PHP 才有實際的用武之處绊茧。PHP 中最重要的 SAPI 是 PHP-FPM铝宵,提供給 Nginx Web 服務(wù)器使用,換句話說按傅,有了應(yīng)用語言的 SAPI捉超,才能擴展 Web 服務(wù)器的功能。

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

圖1

上圖就是 PHP5 相關(guān)的 SAPI,比較熟悉的就是 PHP-FPM况芒,還有命令行的 php-cli惜纸,在 windows 下 SAPI 就是 php5apache2.dll。

2:FastCGI

對于 PHP-FPM 來說:

  • 實現(xiàn)了 PHP 解析器
  • 基于 FastCGI 協(xié)議绝骚,負責(zé)和 Web 服務(wù)器(Nginx耐版、Apache)通信,那什么是 FastCGI压汪?

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

那么我們來理解下 FastCGI 協(xié)議粪牲,簡單說來它就是 Web 服務(wù)器和應(yīng)用(比如 PHP)之間的一個交互標準,一個二進制的協(xié)議止剖,有了該協(xié)議腺阳,Nginx 和 PHP 之間就能夠互相通信了,F(xiàn)astCGI 是 CGI 協(xié)議的一個升級穿香。

光有 FastCGI 協(xié)議沒用亭引,基于該協(xié)議,必須實現(xiàn)一個 SAPI 接口皮获,PHP-FPM 就是一個 FastCGI 協(xié)議的實現(xiàn)焙蚓,它能夠在一組關(guān)聯(lián)的請求中保持一個持久連接(同一個客戶請求由同一個 PHP-FPM 子進程處理),這個持久連接是由 PHP-FPM 處理的洒宝,而不是由 Web 服務(wù)器處理的购公。

相比于 CGI 實現(xiàn)來說,F(xiàn)astCGI 實現(xiàn)能夠減少開銷雁歌,從而提升 Web 服務(wù)器的處理能力宏浩。

一個 Web 請求如下圖:

圖2

Nginx 服務(wù)器通過 FastCgi 協(xié)議,發(fā)送環(huán)境變量和 HTTP 數(shù)據(jù)給 PHP-FPM将宪,Nginx 和 PHP-FPM 之間可以通過 Unix domain socket 和 TCP connection 通信绘闷。PHP-FPM 處理請求后,通過相同的連接返回數(shù)據(jù)給 Nginx较坛。

通過上圖也可以看出印蔗,Nginx 和 PHP-FPM 是互相隔離的,也是異步處理的丑勤,這也正是 Nginx 高效的原因华嘹,關(guān)于這方面可以通過一些專業(yè)文章去了解。Apache 最初使用 mod_php SAPI 處理請求(高度集成)法竞,這也是它緩慢的原因耙厚,但是現(xiàn)在 Apache 通過 FastCGI 協(xié)議也能和 PHP-FPM 通信了。

3:PHP-FPM

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

PHP-FPM 剛才講了很多了薛躬,一方面它基于 FastCGI 協(xié)議實現(xiàn)了協(xié)議的功能,另外一方面它也集成了 PHP 解析器呆细。

PHP-FPM 由一個主進程和多個子進程組成?型宝,主進程復(fù)制與 Web 服務(wù)器通信,接收 HTTP 請求絮爷,然后分配給子進程處理趴酣,子進程主要動態(tài)執(zhí)行 PHP 語言,處理完成后坑夯,最終返回給 Web 服務(wù)器岖寞。

PHP-FPM 有很多優(yōu)點,比如:

  • 能夠動態(tài)產(chǎn)生子進程(PHP解析器)柜蜈。
  • 能夠平滑啟動子進程仗谆。
  • 有獨立的 php-fpm.conf 配置文件,它基于 php.ini 配置文件跨释。
  • fastcgi_finish_request() 功能支持胸私,非常有用的特性。

總之鳖谈,一句話岁疼,對于大型的 PHP 網(wǎng)站來說,PHP-FPM 做了足夠多的優(yōu)化缆娃。

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

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

$ apt-get install php5-fpm
$ service php5-fpm start

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

server {
    listen 80 ;
    server_name  www.simplehttps.com ;
    location ~ \.php$ {
        root           /usr/share/nginx/html;
        #fastcgi_pass   127.0.0.1:9000;
        fastcgi_pass   unix:/var/run/www.simplehttps.com-fpm.sock;
        fastcgi_index  index.php;
        include        fastcgi_params;

        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    }
}

通過配置可以看出:

  • Nginx 可以通過 9000 端口或本地 socket 文件和 PHP-FPM 交互贯要。
  • fastcgi_params 包含了很多 Web 服務(wù)器參數(shù)暖侨,比如 REMOTE_ADDR、QUERY_STRING 等等崇渗。

最后看下 PHP-FPM 文件結(jié)構(gòu)字逗,如圖:

圖3
  • conf.d:一些 php 通用擴展配置文件京郑。(屬于 PHP 的部分)
  • php.ini:PHP 核心配置文件。(屬于 PHP 的部分)
  • php-fpm.conf:fpm 的主配置文件葫掉,主要是 PHP-FPM 主進程使用些举。
  • pool.d:該目錄下加載的配置文件類似于 Web 服務(wù)器中的虛擬主機配置,由 PHP-FPM 子進程處理俭厚。

關(guān)于 php-fpm.conf 和 pool.d 多說幾句:

(1)php-fpm.conf 是 PHP-FPM 的主配置文件户魏,都是全局性配置,但配置項較少挪挤,比如包含 pid叼丑、error_log、events.mechanism 等參數(shù)扛门,理解起來很簡單鸠信。

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

比如我一臺機器上 Nginx 配置了兩個虛擬主機症副,分別是 www.simplehttps.comblog.simplehttps.com。這兩個虛擬主機可以加載不同的 PHP-FPM政基,比如 www.simplehttps.com-fpm.sockblog.simplehttps.com-fpm.sock贞铣,那么這兩個 PHP-FPM 可以使用不同的配置文件(保存在 pool.d 目錄下),配置文件里面的參數(shù)可以自由調(diào)整沮明,以后我會寫文章詳細介紹辕坝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荐健,隨后出現(xiàn)的幾起案子酱畅,更是在濱河造成了極大的恐慌,老刑警劉巖江场,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纺酸,死亡現(xiàn)場離奇詭異,居然都是意外死亡址否,警方通過查閱死者的電腦和手機餐蔬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佑附,“玉大人樊诺,你說我怎么就攤上這事∫敉” “怎么了词爬?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長权均。 經(jīng)常有香客問我顿膨,道長锅锨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任恋沃,我火速辦了婚禮橡类,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芽唇。我一直安慰自己,他們只是感情好取劫,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布匆笤。 她就那樣靜靜地躺著,像睡著了一般谱邪。 火紅的嫁衣襯著肌膚如雪炮捧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天惦银,我揣著相機與錄音咆课,去河邊找鬼。 笑死扯俱,一個胖子當(dāng)著我的面吹牛书蚪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播迅栅,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼殊校,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了读存?” 一聲冷哼從身側(cè)響起为流,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎让簿,沒想到半個月后敬察,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡尔当,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年莲祸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椭迎。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡虫给,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侠碧,到底是詐尸還是另有隱情抹估,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布弄兜,位于F島的核電站药蜻,受9級特大地震影響瓷式,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜语泽,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一贸典、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧踱卵,春花似錦廊驼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至西饵,卻和暖如春酝掩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眷柔。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工期虾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驯嘱。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓镶苞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鞠评。 傳聞我的和親對象是個殘疾皇子宾尚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • FastCGI模塊模塊允許nginx同F(xiàn)astCGI協(xié)同工作,并且控制哪些參數(shù)將被安全傳遞谢澈。 一煌贴、CGI和Fast...
    北山學(xué)者閱讀 9,163評論 3 8
  • 這篇是Nginx安裝配置PHP(FastCGI)環(huán)境的教程。Nginx不支持對外部程序的直接調(diào)用或者解析锥忿,所有的外...
    SkTj閱讀 3,085評論 2 20
  • 1. Nginx的模塊與工作原理 Nginx由內(nèi)核和模塊組成牛郑,其中,內(nèi)核的設(shè)計非常微小和簡潔敬鬓,完成的工作也非常簡單...
    rosekissyou閱讀 10,196評論 5 124
  • CGI钉答、FastCGI 和 PHP-FPM 關(guān)系圖解 在搭建 LAMP/LNMP 服務(wù)器時础芍,會經(jīng)常遇到 PHP-F...
    fingerQin閱讀 1,142評論 1 5
  • 乾剛坤柔,比樂師憂(1)数尿。臨觀之義仑性,或與或求(2)。屯見而不失其居(3)右蹦。蒙雜而著(4)诊杆。震歼捐,起也。艮晨汹,止也豹储。損、...
    在下是魚閱讀 288評論 0 0