PHP-FPM詳解

做用

PHP-FPM(PHP FastCGI Process Manager)意:PHP FastCGI 進程管理器,用於管理PHP 進程池的軟件,用於接受web服務器的請求。
PHP-FPM提供了更好的PHP進程管理方式,能夠有效控制內存和進程、能夠平滑重載PHP配置。php

(1). 爲何會出現php-fpmhtml

fpm的出現所有由於php-fastcgi出現。爲了很好的管理php-fastcgi而實現的一個程序nginx

(2). 什麼是php-fastcgigit

php-fastcgi 只是一個cgi程序,只會解析php請求,而且返回結果,不會管理(所以纔出現的php-fpm)。web

(3)爲何不叫php-cgi服務器

其實在php-fastcgi出現以前是有一個php-cgi存在的,只是它的執行效率低下,所以被php-fastcgi取代。php7

(4)那fastcgi和cgi有什麼區別呢?app

親們,這區別就大了,當一個服務web-server(nginx)分發過來請求的時候,經過匹配後綴知道該請求是個動態的php請求,會把這個請求轉給php。svn

在cgi的年代,思想比較保守,老是一個請求過來後,去讀取php.ini裏的基礎配置信息,初始化執行環境,每次都要不停的去建立一個進程,讀取配置,初始化環境,返回數據,退出進程,長此以往,啓動進程的工做變的乏味無趣特別累。php-fpm

當php來到了5的時代,你們對這種工做方式特別反感,想偷懶的人就拼命的想,我可不可讓cgi一次啓動一個主進程(master),讓他只讀取一次配置,而後在啓動多個工做進程(worker),當一個請求來的時候,經過master傳遞給worker這樣就能夠避免重複勞動了。因而就產生了fastcgi。

(5)fastcgi這麼好,啓動的worker用完怎麼辦?
當worker不夠的時候,master會經過配置裏的信息,動態啓動worker,等空閒的時候能夠收回worker

(6)到如今仍是沒明白php-fpm 是個什麼東西?
就是來管理啓動一個master進程和多個worker進程的程序.PHP-FPM 會建立一個主進程,控制什麼時候以及如何將HTTP請求轉發給一個或多個子進程處理。

PHP-FPM主進程還控制着何時建立(處理Web應用更多的流量)和銷燬(子進程運行時間過久或再也不須要了)PHP子進程。PHP-FPM進程池中的每一個進程存在的時間都比單個HTTP請求長,能夠處

理十、50、100、500或更多的HTTP請求。

安裝

PHP在 5.3.3 以後已經把php-fpm併入到php的核心代碼中了。 因此php-fpm不須要單獨的下載安裝。
要想php支持php-fpm,只須要在編譯php源碼的時候帶上 --enable-fpm 就能夠了。

全局配置

在Centos中,PHP-FPM 的主配置文件是 /etc/php7/php-fpm.conf。

指定一段時間內有指定個子進程失效了,PHP-FPM重啓:

#在指定的一段時間內,若是失效的PHP-FPM子進程數超過這個值,PHP-FPM主進程將優雅重啓。
emergency_restart_threshold = 10 #設定emergency_restart_interval 設置採用的時間跨度。 emergency_restart_interval = 1m

配置進程池

PHP-FPM配置文件其他的內容是一個名爲Pool Defintions的區域。這個區域裏的配置用戶設置每一個PHP-FPM進程池。PHP-FPM進程池中是一系列相關的PHP子進程。

一般一個PHP應用有本身一個進程池

Centos在PHP-FPM主配置文件的頂部引入進程池定義文件:

include=/etc/php7/php-fpm.d/*.conf

www.conf 是PHP-FPM進程池的默認配置文件

user= nobody
#擁有這個 PHP-FPM進程池中子進程的系統用戶。要把這個設置的值設用的非根用戶的用戶名。 group = nobody #擁有這個 PHP-FPM進程池中子進程的系統用戶組。要把這個設置的值設應用的非根用戶所屬的用戶組名。 listen=[::]]:9000 #PHP-FPM進程池監聽的IP地址和端口號,讓 PHP-FPM 只接受 nginx從這裏傳入的請求。 listen. allowed clients =127.0.0.1 #能夠向這個 PHP-FPM進程池發送請求的IP地址(一個或多個)。 pm.max children =51 #這個設置設定任什麼時候間點 PHP-FPM進程池中最多能有多少個進程。這個設置沒有絕對正確的值,你應該測試你的PHP應用,肯定每一個PHP進程須要使用多少內存,而後把這個設置設爲設備可用內存能容納的PHP進程總數。對大多數中小型PHP應用來講,每一個PHP進程要使用5~15MB內存(具體用量可能有差別)。 假設咱們使用設備爲這個PHP-FPM進程池分配了512MB可用內存,那麼能夠把這個設置設爲(512MB總內存)/(每一個進程使用10MB) = 51個進程。 ...

編輯保存,重啓PHP-FPM主進程:

sudo systemctl restart php-fpm.service

PHP-FPM進程池的配置詳情參見 http://php.net/manual/install.fpm.configuration.php

參考Company開發環境

測試環境的配置以下:

[www]
user = nobody #進程的發起用戶和用戶組,用戶user是必須設置,group不是 nobody 任意用戶 group = nobody listen = [::]:9000 #監聽ip和端口,[::] 表明任意ip chdir = /app #在程序啓動時將會改變到指定的位置(這個是相對路徑,相對當前路徑或chroot後的「/」目錄)  pm = dynamic #選擇進程池管理器如何控制子進程的數量 
#static: 對於子進程的開啓數路給定一個鎖定的值(pm.max_children)
#dynamic: 子進程的數目爲動態的,它的數目基於下面的指令的值(如下爲dynamic適用參數) pm.max_children = 16 #同一時刻可以存貨的最大子進程的數量 pm.start_servers = 4 #在啓動時啓動的子進程數量 pm.min_spare_servers = 2 #處於空閒"idle"狀態的最小子進程,若是空閒進程數量小於這個值,那麼相應的子進程會被建立 pm.max_spare_servers = 16 #最大空閒子進程數量,空閒子進程數量超過這個值,那麼相應的子進程會被殺掉。 catch_workers_output = Yes #將worker的標準輸出和錯誤輸出重定向到主要的錯誤日誌記錄中,若是沒有設置,根據FastCGI的指定,將會被重定向到/dev/null上

生產環境配置:

轉發請求給PHP-FPM

nginx爲例:

server {
       listen       83; server_name mobile.com; root /app/mobile/web/; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location / { index index.html index.htm index.php; # Redirect everything that isn't a real file to index.php try_files $uri $uri/ /index.php$is_args$args; } #把HTTP請求轉發給PHP-FPM進程池處理 location ~ .*\.php include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass 192.168.33.30:9000; #監聽9000端口 fastcgi_index index.php; try_files $uri =404; #include fastcgi.conf; } location ~ /\.(ht|svn|git) { deny all; } access_log /app/wwwlogs/access.log; error_log /app/wwwlogs/error.log; }

php-fpm啓動,重啓,終止操做

啓動php-fpm:

/usr/sbin/php-fpm

/usr/local/php/sbin/php-fpm

php 5.3.3 之後的php-fpm 再也不支持 php-fpm 之前具備的 /usr/local/php/sbin/php-fpm (start|stop|reload)等命令,因此不要再看這種老掉牙的命令了,須要使用信號控制:

master進程能夠理解如下信號

INT, TERM 馬上終止
QUIT 平滑終止
USR1 從新打開日誌文件
USR2 平滑重載全部worker進程並從新載入配置和二進制模塊

 

一個簡單直接的重啓方法:

先查看php-fpm的master進程號

# ps aux|grep php-fpm
root     21891  0.0  0.0 112660   960 pts/3    R+   16:18   0:00 grep --color=auto php-fpm root 42891 0.0 0.1 182796 1220 ? Ss 4月18 0:19 php-fpm: master process (/usr/local/php/etc/php-fpm.conf) nobody 42892 0.0 0.6 183000 6516 ? S 4月18 0:07 php-fpm: pool www nobody 42893 0.0 0.6 183000 6508 ? S 4月18 0:17 php-fpm: pool www

重啓php-fpm:

kill -USR2 42891

 

上面方案通常是沒有生成php-fpm.pid文件時使用,若是要生成php-fpm.pid,使用下面這種方案:

上面master進程能夠看到,matster使用的是/usr/local/php/etc/php-fpm.conf這個配置文件,cat /usr/local/php/etc/php-fpm.conf 發現:

[global]
; Pid file ; Note: the default prefix is /usr/local/php/var ; Default Value: none ;pid = run/php-fpm.pid

pid文件路徑應該位於/usr/local/php/var/run/php-fpm.pid,因爲註釋掉,因此沒有生成,咱們把註釋去除,再kill -USR2 42891 重啓php-fpm,便會生成pid文件,下次就可使用如下命令重啓,關閉php-fpm了:

php-fpm 關閉:kill -INT 'cat /usr/local/php/var/run/php-fpm.pid'php-fpm 重啓:kill -USR2 'cat /usr/local/php/var/run/php-fpm.pid'

相關文章
相關標籤/搜索