最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 解析PHP-FPM的一些心得

    正文概述 转载于:掘金(程序员安安)   2021-08-14   461

    作用

    php-FPM(PHP FastCGI Process Manager)意:PHP FastCGI 进程管理器,用于管理PHP 进程池的软件,用于接受web服务器的请求。
    PHP-FPM提供了更好的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进程池的配置详情参见 php.net/manual/inst…

    参考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大厂PDF,PHP进阶架构视频资料,PHP精彩好文可以微信搜索关注:PHP开源社区

    2021PHP大厂面试真题集锦,必看!

    四年精华PHP技术文章整理合集——PHP框架篇

    四年精华PHP技术文合集——微服务架构篇

    四年精华PHP技术文合集——分布式架构篇

    四年精华PHP技术文合集——高并发场景篇

    四年精华PHP技术文章整理合集——数据库篇


    起源地 » 解析PHP-FPM的一些心得

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元