详解PHP中PHP-FPM是什么?有什么用?【PHP教程】

!
也想出现在这里? 联系我们
信息

详解PHP中PHP-FPM是什么?有什么用?,第1张

概述详解PHP中PHP-FPM是什么?有什么用?

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 = nobodyListen = [::]:9000          #监听ip和端口,[::] 代表任意ipchdir = /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-fpmroot     21891  0.0  0.0 112660   960 pts/3    R+   16:18   0:00 grep --color=auto PHP-fpmroot     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 wwwnobody   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中PHP-FPM是什么?有什么用?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

© 版权声明
THE END
喜欢就支持一下吧
点赞180 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容