PHP-FPM详解
<h1 id="作用">作用</h1><p>PHP-FPM(PHP FastCGI Process Manager)意:PHP FastCGI 进程管理器,用于管理PHP 进程池的软件,用于接受web服务器的请求。<br>PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置。</p>
<p>(1). 为什么会出现php-fpm</p>
<p>fpm的出现全部因为php-fastcgi出现。为了很好的管理php-fastcgi而实现的一个程序</p>
<p>(2). 什么是php-fastcgi</p>
<p>php-fastcgi 只是一个cgi程序,只会解析php请求,并且返回结果,不会管理(因此才出现的php-fpm)。</p>
<p>(3)为什么不叫php-cgi</p>
<p>其实在php-fastcgi出现之前是有一个php-cgi存在的,只是它的执行效率低下,因此被php-fastcgi取代。</p>
<p>(4)那fastcgi和cgi有什么区别呢?</p>
<p>亲们,这区别就大了,当一个服务web-server(nginx)分发过来请求的时候,通过匹配后缀知道该请求是个动态的php请求,会把这个请求转给php。</p>
<p>在cgi的年代,思想比较保守,总是一个请求过来后,去读取php.ini里的基础配置信息,初始化执行环境,每次都要不停的去创建一个进程,读取配置,初始化环境,返回数据,退出进程,久而久之,启动进程的工作变的乏味无趣特别累。</p>
<p>当php来到了5的时代,大家对这种工作方式特别反感,想偷懒的人就拼命的想,我可不可以让cgi一次启动一个主进程(master),让他只读取一次配置,然后在启动多个工作进程(worker),当一个请求来的时候,通过master传递给worker这样就可以避免重复劳动了。于是就产生了fastcgi。</p>
<p>(5)fastcgi这么好,启动的worker用完怎么办?<br>当worker不够的时候,master会通过配置里的信息,动态启动worker,等空闲的时候可以收回worker</p>
<p>(6)到现在还是没明白php-fpm 是个什么东西?<br>就是来管理启动一个master进程和多个worker进程的程序.PHP-FPM 会创建一个主进程,控制何时以及如何将HTTP请求转发给一个或多个子进程处理。</p>
<p>PHP-FPM主进程还控制着什么时候创建(处理Web应用更多的流量)和销毁(子进程运行时间太久或不再需要了)<em id="__mceDel">PHP子进程。PHP-FPM进程池中的每个进程存在的时间都比单个HTTP请求长,可以处</em></p>
<p><em id="__mceDel">理10、50、100、500或更多的HTTP请求。</em></p>
<h1 id="安装">安装</h1>
<p>PHP在 5.3.3 之后已经把php-fpm并入到php的核心代码中了。 所以php-fpm不需要单独的下载安装。<br>要想php支持php-fpm,只需要在编译php源码的时候带上 --enable-fpm 就可以了。</p>
<h1 id="全局配置">全局配置</h1>
<p>在Centos中,PHP-FPM 的主配置文件是 /etc/php7/php-fpm.conf。</p>
<p>指定一段时间内有指定个子进程失效了,PHP-FPM重启:</p>
<div class="cnblogs_code">
<pre>#在指定的一段时间内,如果失效的PHP-FPM子进程数超过这个值,PHP-<span>FPM主进程将优雅重启。
emergency_restart_threshold = 10<span>
#设定emergency_restart_interval 设置采用的时间跨度。
emergency_restart_interval = 1m</span></span></pre>
</div>
<h1 id="配置进程池">配置进程池</h1>
<p>PHP-FPM配置文件其余的内容是一个名为Pool Defintions的区域。这个区域里的配置用户设置每个PHP-FPM进程池。PHP-FPM进程池中是一系列相关的PHP子进程。</p>
<p><strong>通常一个PHP应用有自己一个进程池</strong></p>
<p>Centos在PHP-FPM主配置文件的顶部引入进程池定义文件:</p>
<div class="cnblogs_code">
<pre>include=/etc/php7/php-fpm.d/*.conf</pre>
</div>
<p><strong>www.conf 是PHP-FPM进程池的默认配置文件</strong>。</p>
<div class="cnblogs_code">
<pre>user=<span> nobody
#拥有这个 PHP-<span>FPM进程池中子进程的系统用户。要把这个设置的值设用的非根用户的用户名。
group =<span> nobody
#拥有这个 PHP-<span>FPM进程池中子进程的系统用户组。要把这个设置的值设应用的非根用户所属的用户组名。
listen=[::]]:9000<span>
#PHP-FPM进程池监听的IP地址和端口号,让 PHP-<span>FPM 只接受 nginx从这里传入的请求。
listen. allowed clients =127.0.0.1<span>
#可以向这个 PHP-<span>FPM进程池发送请求的IP地址(一个或多个)。
pm.max children =51<span>
#这个设置设定任何时间点 PHP-FPM进程池中最多能有多少个进程。这个设置没有绝对正确的值,你应该测试你的PHP应用,确定每个PHP进程需要使用多少内存,然后把这个设置设为设备可用内存能容纳的PHP进程总数。对大多数中小型PHP应用来说,每个PHP进程要使用5~15MB内存(具体用量可能有差异)。 假设我们使用设备为这个PHP-FPM进程池分配了512MB可用内存,那么可以把这个设置设为(512MB总内存)/(每个进程使用10MB) =<span> 51个进程。
...</span></span></span></span></span></span></span></span></span></span></pre>
</div>
<p>编辑保存,重启PHP-FPM主进程:</p>
<div class="cnblogs_code">
<pre>sudo systemctl restart php-fpm.service</pre>
</div>
<p>PHP-FPM进程池的配置详情参见 http://php.net/manual/install.fpm.configuration.php</p>
<h2 id="参考company开发环境">参考Company开发环境</h2>
<p>测试环境的配置如下:</p>
<div class="cnblogs_code">
<pre><span>
user =<span> nobody #进程的发起用户和用户组,用户user是必须设置,group不是nobody 任意用户
group =<span> nobody
listen = [::]:9000<span> #监听ip和端口,[::] 代表任意ip
chdir = /app #在程序启动时将会改变到指定的位置(这个是相对路径,相对当前路径或chroot后的“/<span>”目录)
pm =<span> dynamic #选择进程池管理器如何控制子进程的数量<br>#static: 对于子进程的开启数路给定一个锁定的值(pm.max_children) <br>#dynamic: 子进程的数目为动态的,它的数目基于下面的指令的值(以下为dynamic适用参数)
pm.max_children = 16<span> #同一时刻能够存货的最大子进程的数量
pm.start_servers = 4<span> #在启动时启动的子进程数量
pm.min_spare_servers = 2 #处于空闲"idle"<span>状态的最小子进程,如果空闲进程数量小于这个值,那么相应的子进程会被创建
pm.max_spare_servers = 16<span> #最大空闲子进程数量,空闲子进程数量超过这个值,那么相应的子进程会被杀掉。
catch_workers_output = Yes#将worker的标准输出和错误输出重定向到主要的错误日志记录中,如果没有设置,根据FastCGI的指定,将会被重定向到/dev/null上</span></span></span></span></span></span></span></span></span></span></pre>
</div>
<p>生产环境配置:</p>
<h1 id="转发请求给php-fpm">转发请求给PHP-FPM</h1>
<p>nginx为例:</p>
<div class="cnblogs_code">
<pre><span>server {
listen 83<span>;
server_name mobile.com;
root /app/mobile/web/<span>;
error_page 500 502 503 504/<span>50x.html;
location = /<span>50x.html {
root /usr/share/nginx/<span>html;
}
location /<span> {
indexindex.html index.htm index.php;
# Redirect everything that isn't a real file to index.php
try_files $uri $uri/ /<span>index.php$is_args$args;
}
#把HTTP请求转发给PHP-<span>FPM进程池处理
location ~ .*<span>\.php include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 192.168.33.30:9000<span>; #监听9000端口
fastcgi_indexindex.php;
try_files $uri =404<span>;
#include fastcgi.conf;
}
location ~ /\.(ht|svn|<span>git) {
deny all;
}
access_log/app/wwwlogs/<span>access.log;
error_log /app/wwwlogs/<span>error.log;
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
</div>
<h1 class="title-article">php-fpm启动,重启,终止操作</h1>
<p>启动php-fpm:</p>
<div class="cnblogs_code">
<pre>/usr/sbin/php-fpm<br>或<br>/usr/<span class="hljs-built_in">local/php/sbin/php-fpm</span></pre>
</div>
<p>php 5.3.3 以后的php-fpm 不再支持 php-fpm 以前具有的 /usr/local/php/sbin/php-fpm (start|stop|reload)等命令,所以不要再看这种老掉牙的命令了,需要使用信号控制:</p>
<p>master进程可以理解以下信号</p>
<p>INT, TERM 立刻终止<br>QUIT 平滑终止<br>USR1 重新打开日志文件<br>USR2 平滑重载所有worker进程并重新载入配置和二进制模块</p>
<p> </p>
<p>一个简单直接的重启方法:</p>
<p>先查看php-fpm的master进程号</p>
<div class="cnblogs_code">
<pre># ps aux|grep php-<span>fpm
root 218910.00.0 112660 960 pts/3 R+ 16:18 0:00 grep --color=auto php-<span>fpm
root 428910.00.1 1827961220 ? Ss 4月18 0:19 php-fpm: master process (/usr/local/php/etc/php-<span>fpm.conf)
nobody 428920.00.6 1830006516 ? S 4月18 0:07 php-<span>fpm: pool www
nobody 428930.00.6 1830006508 ? S 4月18 0:17 php-fpm: pool www</span></span></span></span></pre>
</div>
<p>重启php-fpm:</p>
<div class="cnblogs_Highlighter">
<pre class="brush:php;gutter:true;">kill -USR2 42891</pre>
</div>
<p> </p>
<p>上面方案一般是没有生成php-fpm.pid文件时使用,如果要生成php-fpm.pid,使用下面这种方案:</p>
<p>上面master进程可以看到,matster使用的是/usr/local/php/etc/php-fpm.conf这个配置文件,cat /usr/local/php/etc/php-fpm.conf 发现:</p>
<div class="cnblogs_code">
<pre><span>
; Pid file<span>
; Note: the default prefix is /usr/local/php/<span>var
; Default Value: none
;pid = run/php-fpm.pid</span></span></span></pre>
</div>
<p>pid文件路径应该位于/usr/local/php/var/run/php-fpm.pid,由于注释掉,所以没有生成,我们把注释去除,再kill -USR2 42891 重启php-fpm,便会生成pid文件,下次就可以使用以下命令重启,关闭php-fpm了:</p>
<p>php-fpm 关闭:<br>kill -INT 'cat /usr/local/php/var/run/php-fpm.pid'<br>php-fpm 重启:<br>kill -USR2 'cat /usr/local/php/var/run/php-fpm.pid'</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/mzhaox/p/11230923.html
頁:
[1]