瞭解PHP-FPM

在服務器上,當咱們查看php進程時,全都是php-fpm進程,你們都知道這個就是php的運行環境,那麼,它究竟是個什麼東西呢?php

PHP-FPM簡介

PHP-FPM,就是PHP的FastCGI管理器,用於替換PHP FastCGI的大部分附加功能,在PHP5.3.3後已經成爲了PHP的標配。html

有小夥伴要問了,FastCGI又是什麼鬼?CGI程序又叫作「通用網關接口」,就是讓Web服務器和你的應用程序進行交互的一個接口。就像nginx中須要配置的fastcgi_pass,通常咱們會使用127.0.0.1:9000或者unix:/tmp/php-cgi.sock來配置這個參數。它的意思就是告訴nginx,過來的請求使用tcp:9000端口的監聽程序來處理或者使用unix/socket來處理。它們都是指向的PHP運行程序。python

再說得通俗一點,咱們運行php腳本用的是nginx

php aaa.php

php-fpm就至關因而這個php命令。nginx經過fastcgi_pass來運行php $nginx_root(nginx配置文件中網站根目錄root配置)下的index.php。因此,若是你用的是python或者其餘什麼語言,均可以用它們的cgi程序來讓nginx調用。緩存

FastCGI和CGI又有什麼不一樣呢?FastCGI是啓動一個socket接口,服務器應用不須要本身去運行php,只須要向這個socket接口提交請求就能夠了。服務器

php-fpm在編譯php時須要添加--enable-fpm。一些通用的集成安裝包如lnmp、phpStudy等都會默認編譯並使用php-fpm,畢竟是標配。網絡

tcp socket與unix socket

上文中說過nginx可使用127.0.0.1:9000和unix:/tmp/php-cgi.sock這兩種方式來調用php-fpm。它們有什麼區別呢?socket

前者,通常帶9000端口號的,是tcp形式的調用。也就是php-fpm啓動了一個監聽進程對9000端口進行監聽。它會調起一個tcp/ip服務,nginx在調用的時候會走一次tcp請求流程,也就是3次握手4次揮手,會走到網絡七層中的第四層傳輸層。相對來講這種方式性能會稍差一點,啓動php-fpm後使用nestat查看端口中會出現9000端口的佔用。tcp

後者,使用的是unix套接字socket服務,經過sock文件來交換信息,性能相對好一些,由於它沒有tcp鏈接過程,也不會有9000端口的佔用。php-fpm

對於高負載大訪問量的網站仍是推薦使用unix方式,對於普通小網站來講,無所謂使用哪一個均可以,tcp方式反而更容易配置和理解,也是php-fpm.conf中默認的監聽方式。

php-fpm.conf配置中的listen屬性用來配置監聽,這裏的配置要和nginx中的一致,使用tcp的就監聽127.0.0.1:9000,使用unix的就設置成/tmp/php-cgi-56.sock。

PHP-FPM的功能

如下內容摘自官方文檔:

  • 支持平滑中止/啓動的高級進程管理功能
  • 能夠工做於不一樣的 uid/gid/chroot 環境下,並監聽不一樣的端口和使用不一樣的 php.ini 配置文件(可取代 safe_mode 的設置)
  • stdout 和 stderr 日誌記錄
  • 在發生意外狀況的時候可以從新啓動並緩存被破壞的 opcode
  • 文件上傳優化支持
  • "慢日誌" - 記錄腳本(不只記錄文件名,還記錄 PHP backtrace 信息,可使用 ptrace或者相似工具讀取和分析遠程進程的運行數據)運行所致使的異常緩慢;
  • fastcgi_finish_request() - 特殊功能:用於在請求完成和刷新數據後,繼續在後臺執行耗時的工做(錄入視頻轉換、統計處理等)
  • 動態/靜態子進程產生
  • 基本 SAPI 運行狀態信息(相似Apache的 mod_status)
  • 基於 php.ini 的配置文件
本文參考:
相關文章
相關標籤/搜索