PHP-FPM(PHP FastCGI Process Manager)意:PHP FastCGI 進程管理器,用於管理PHP 進程池的軟體,用於接受web伺服器的請求。
作用
PHP-FPM提供了更好的PHP進程管理方式,可以有效控制記憶體和進程、可以平滑重載PHP配置。
【相關推薦:PHP教學】
(1). 為什麼會出現php-fpm
fpm的出現全部因為php-fastcgi出現。為了很好的管理php-fastcgi而實現的一個程式
(2). 什麼是php-fastcgi
php-fastcgi 只是一個cgi程式,只會解析php請求,並且傳回結果,不會管理(因此才出現的php-fpm)。
(3)為什麼不叫php-cgi
其實在php-fastcgi出現之前是有一個php-cgi存在的,只是它的執行效率低下,因此被php-fastcgi取代。
(4)那fastcgi和cgi有什麼差別呢?
親們,這區別就大了,當一個服務web-server(nginx)分發過來請求的時候,透過匹配後綴知道該請求是個動態的php請求,會把這個請求轉給php。
在cgi的年代,思想比較保守,總是一個請求過來後,去讀取php.ini裡的基礎配置信息,初始化執行環境,每次都要不停的去創建一個進程,讀取配置,初始化環境,返回數據,退出進程,久而久之,啟動進程的工作變的乏味無趣特別累。
當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請求長,可以處
#理10、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'
相关学习推荐:PHP编程从入门到精通
以上是詳解PHP中PHP-FPM是什麼?有什麼用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!