天天看點

了解PHP-FPM

在伺服器上,當我們檢視php程序時,全都是php-fpm程序,大家都知道這個就是php的運作環境,那麼,它到底是個什麼東西呢?

PHP-FPM簡介

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

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

再說得通俗一點,我們運作php腳本用的是

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。它們有什麼差別呢?

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

後者,使用的是unix套接字socket服務,通過sock檔案來交換資訊,性能相對好一些,因為它沒有tcp連接配接過程,也不會有9000端口的占用。

PHP-FPM的功能

  • 支援平滑停止/啟動的進階程序管理功能
  • 可以工作于不同的 uid/gid/chroot 環境下,并監聽不同的端口和使用不同的 php.ini 配置檔案(可取代 safe_mode 的設定)
  • stdout 和 stderr 日志記錄
  • 在發生意外情況的時候能夠重新啟動并緩存被破壞的 opcode
  • 檔案上傳優化支援
  • "慢日志" - 記錄腳本(不僅記錄檔案名,還記錄 PHP backtrace 資訊,可以使用 ptrace或者類似工具讀取和分析遠端程序的運作資料)運作所導緻的異常緩慢;
  • fastcgi_finish_request() - 特殊功能:用于在請求完成和重新整理資料後,繼續在背景執行耗時的工作(錄入視訊轉換、統計處理等)
  • 動态/靜态子程序産生
  • 基本 SAPI 運作狀态資訊(類似Apache的 mod_status)
  • 基于 php.ini 的配置檔案
php