一文看懂PHP进程管理器php-fpm

php-fpm是什么

php-fpm是PHP的一个进程管理器。php下面的众多work进程皆有php-fpm进程管理器管理。

php-fpm的工作原理

php-fpm全名是PHP FastCGI进程管理器。php-fpm启动后会先读php.ini,然后再读相应的conf配置文件,conf配置可以覆盖php.ini的配置。
启动php-fpm之后,会创建一个master进程,监听9000端口(可配置),master进程又会根据fpm.conf/www.conf去创建若干子进程,子进程用于处理实际的业务。
当有客户端(比如nginx)来连接9000端口时,空闲子进程会自己去accept,如果子进程全部处于忙碌状态,新进的待accept的连接会被master放进队列里,等待fpm子进程空闲;这个存放待accept的半连接的队列有多长,由listen.backlog 配置。

如何查看php-fpm进程与子进程

查看php-fpm相关的所有进程。如下图

这里pool www皆是php-fpm的子进程,也就是我们常说的work进程。

查看php-fpm下面的子进程

通过上面的命令,其实我们能够看出php-fpm相关的进程了,如果我们需要更加直观的查看php-fpm的master进程和work进程,可以通过下面的方式进程查看。
这里的5370则是php-fpm的master进程号。通过上面的命令已经很能直观的得出。

通过上面的命令,可以看出php-fpm作为master进程,下面有15个子进程。这里的子进程数都是可以进程自定义配置。通过如下几个参数进程配置:

pm = dynamic # 动态创建子进程
pm.max_children = 20 # 最大子进程数
pm.start_servers = 15 # 初始化php-fpm进程时,默认的子进程数

php-fpm参数配置说明

php-fpm全局配置参数

#php-fpm的运行权限。
#以什么用户什么组的权限来运行池fpm。
user = www
group = www

#php-fpm的运行方式,可以使端口,也可以使socke文件。
#如果是端口则是走tcp,如果是socket则直接读socket文件,这样性能相对更好。
listen = 127.0.0.1:9000 

#拥有socket权限的用户,需要和上面的user、group配置相结合。
#如果采用的端口的方式,则不配置。
listen.owner = www
listen.group = www
listen.mode = 0660

#这是php-fpm端口连接的地址。多个用","隔开。默认任意地址都可以连接。
#例如Nginx和php-fpm不在同一台服务器上,这里的值就是Nginx服务的ip地址。
#当Nginx和php-fpm配置在同一台服务器上,则直接写127.0.0.1即可。
listen.allowed_clients = 127.0.0.1 

#pid进程文件存放的位置,当我们启用一个php服务,
#则会自动创建一个该pid文件,其实我们可以直接把该文件理解理解php-fpm的进程号文件,
#两则是等价的。默认为none。
pid = /opt/remi/php72/root/var/run/php-fpm/php-fpm.pid 

#错误日志位置,默认:安装路径 #INSTALL_PREFIX#/log/php-fpm.log。
#如果设置为syslog,log就会发送给syslogd服务而不会写进文件里。
error_log = /opt/remi/php72/root/var/log/php-fpm/error.log 

#PHP限制的文件扩展名
security.limit_extensions = .php .php3 .php4 .php5 .php7

#系统日志标示,如果跑了多个fpm进程,需要用这个来区分日志是谁的。
syslog.ident = php-fpm 

#日记登记,可选:alert, error, warning, notice, debug。
log_level = notice 

#紧急重启阈值,需要与下面emergency_restart_interval参数一起配置。
emergency_restart_threshold = 60 

# 紧急重启阈值的时间范围。在此参数设置的时间内,
# 出现SIGSEGV或SIGBUS的子进程数超过emergency_restart_threshold参数设置的值。
# 那么fpm就会优雅的重启,值是0表示off这个功能,可用的单位有:s秒,m分,h时,d天。
emergency_restart_interval = 60s 

#设置子进程接受主进程复用信号的超时时间。
process_control_timeout = 0 

#当动态管理子进程时,fpm最多能fork多少个进程,0表示无限制,
# 这是所有进程池能启动子进程的总和,谨慎使用。
process.max = 128 

#设置子进程的优先级,在master进程以root用户启动时有效;
#如果没有设置,子进程会继承master进程的优先级,值范围-19(最高)到20(最低),默认不设置。
process.priority = -19 

#设置成no用于调试bug,默认为yes。
daemonize = yes 

#master进程最多能打开的文件数量。默认采用系统设置的值。
rlimit_files = 1024 

#master进程核心rlimit限制值;可选unlimited或>=0的整数,默认为系统的值。
rlimit_core = 0

#事件处理机制,默认自动检测,可选值:select,poll,
#epoll(linux>=2.5.44),kqueue,/dev/poll,port
events.mechanism = epoll 

#fpm想系统发送状态的频率。单位有s,m,h。
#前提是fpm被设置会系统服务。
systemd_interval = 10s

php-fpm的进程进程池配置

#php-fpm的队列长度。
listen.backlog = 65535 

#php进程池权限,同样要master进程是root用户才有效,
#和上面的全局设置一样,不设置的话会继承master进程的优先级。
process.priority = -19 

#子进程管理方式
#static(静态配置,在启动php-fpm时根据该值创建固定的子进程数量);
#dynamic(动态配置,在启动php-fpm时根据pm.start_servers的值初始化对应的子进程数,至少一个子进程);
#ondemand(按需配置,在启动php-fpm时不创建子进程,而是根据请求动态fork子进程);
pm = dynamic 

#最大子进程数量
pm.max_children = 5 

#初始化子进程数量,与上面的pm = dynamic配置使用。
pm.start_servers = 2 

#服务器闲置时最少保持2个子进程,不够这个数就会创建,只适用动态dynamic管理方式
pm.min_spare_servers = 2 

#服务器闲置时最多要有几个,多了会kill,只适用动态dynamic管理方式
pm.max_spare_servers = 3 

#子进程闲置时间,也就是说子进程没有可处理的任务时,在该之间使就会被killed。
pm.process_idle_timeout = 10s

#每个子进程最大的处理请求数量。在一定程度上可以防止内存泄漏。
pm.max_requests = 500 

#php-fpm状态监控的uri
pm.status_path string

#php-fpm监控页面的 ping 网址。
#如果没有设置,则无法访问 ping 页面。
#该页面用于外部检测php-fpm是否存活并且可以响应请求。请注意必须以斜线开头(/)。
ping.path string

#用于定义ping请求的返回响应。返回为 HTTP 200 的 text/plain 格式文本。默认值:pong。
ping.response string

#设置worker的nice(2)优先级(如果设置了的话)。
#该值从 -19(最高优先级) 到 20(更低优先级)。
#默认值:不设置
process.priority int

#检测路径时使用的前缀
prefix string

#访问文件日志,没啥用处,比如yii2每次都记录访问index.php,只是记录真实的PHP文件。
access.log = var/log/$pool.access.log 

#php的慢日志
slowlog = var/log/$pool.log.slow 

#慢日志时间阈值
request_slowlog_timeout = 2s 

#单个请求的超时时间,当php.ini设置的最大执行时间未生效,则交由它来处理。
request_terminate_timeout = 3s 

#最大打开句柄数,默认为系统值。
rlimit_files = 1024 

#最多的核心使用数,默认为系统分配。
rlimit_core = 0 

部分配置演示

php-fpm的backlog大小设置

php-fpm的backlog大小设置与php-fpm的处理能力有关,而不是越大越好。

当该值设置过大,导致php-fpm处理不过来,nginx那边等待超时,断开连接,报504 gateway timeout错。同时php-fpm处理完准备write 数据给nginx时,发现TCP连接断开了,报“Broken pipe”。

当该值设置过小,nginx之类的client请求,根本进入不了php-fpm的accept queue,报“502 Bad Gateway”错。所以,这还得去根据php-fpm的QPS来决定backlog的大小。计算方式最好为QPS=backlog。

php-fpm启动模式

php-fpm以socket启动或者端口启动,这两种的方式根据实际情况进行配置。

nginx和php-fpm在同一台服务器上,这时可以直接用unix socket进程间通信,不走tcp端口通信,可以节约创建连接的时间,从而提高性能。sock文件随便创建到哪里都可以,只要fpm有权限在那个目录里写文件,nginx有权限去读就可以。tcp连接会更稳定,因为有tcp协议保证数据的正确性,但是sock有更少的数据拷贝和上下文切换,更少的资源占用。不过只能在nginx和fpm在同一台机器上才能用socket。

如何选择socket启动还是端口启动。

由于tcp方式相对unix的方式,并发量更高,因此针对并发量高的项目,建议采用tcp方式,现在Nginx配置示例文件默认的也是tcp方式。

使用unix方式,可以优化的点,就是将socket文件放在/dev/shm目录下面,大致的意思,就是该目录下面的文件是不是存储再硬盘中的,而是存储再内存中的。至于硬盘读取和内存读取,谁快谁慢,肯定是内存最快了。

socket方式启动如何查看socke文件。

socket文件是根据上面提到的pid配置项而定的。我们可以直接使用cat命令,查看进程号。

子进程默认启动数量,通过上面的pm = dynamic 配置,我们知道这种方式是动态配置子进程大小的,同时我们也可以设置默认的子进程数。

pm = dynamic
pm.max_children = 20
### 默认15个子进程,演示的效果就是上面的shell命令的结果图。
pm.start_servers = 15

当我们尝试设置为3时,显示如下错误信息。

说明,这里的start_servers配置项和min_spare_servers配置是有一定的关系的。我们设置为最小10,结果就能正常启动php-fpm了。

以上就是一文看懂PHP进程管理器php-fpm的详细内容,更多关于PHP进程管理器php-fpm的资料请关注我们其它相关文章!

(0)

相关推荐

  • php进程(线程)通信基础之System V共享内存简单实例分析

    本文实例讲述了php进程(线程)通信基础之System V共享内存.分享给大家供大家参考,具体如下: PHP默认情况没有开启功能,要支持该功能在编译PHP的时候要加入下面几个选项  System V消息,--enable-sysvmsg   System V信号量支持,--enable-sysvsem  System V共享内存支持,--enable-sysvshm PHP还挺shmop共享内存,在编译的时候开启 --enable-shmop System V共享内存的相关函数: 1: 创建信号

  • PHP基于进程控制函数实现多线程

    php有一组进程控制函数(编译时需要–enable-pcntl与posix扩展),使得php能在nginx系统中实现跟c一样的创建子进程.使用exec函数执行程序.处理信号等功能. CentOS 6 下yum安装php的,默认是不安装pcntl的,因此需要单独编译安装,首先下载对应版本的php,解压后 cd php-version/ext/pcntl phpize ./configure && make && make install cp /usr/lib/php/mod

  • php 多进程编程父进程的阻塞与非阻塞实例分析

    本文实例讲述了php 多进程编程父进程的阻塞与非阻塞.分享给大家供大家参考,具体如下: php中进程的阻塞,主要是父进程等待子进程退出. 1.php代码如下: <?php //定义进程数量 define('FORK_NUMS', 5); //用于保存进程pid $pids = array(); //我们创建5个子进程 for ($i = 0; $i < FORK_NUMS; ++$i) { $pids[$i] = pcntl_fork(); if ($pids[$i] == -1) { die

  • php 的多进程操作实践案例分析

    本文实例讲述了php 的多进程操作.分享给大家供大家参考,具体如下: php的多进程处理依赖于pcntl扩展,通过pcntl_fork创建子进程来进行并行处理. 例1如下: <?php $pid = pcntl_fork(); if($pid == -1) { //错误处理:创建子进程失败时返回-1. die('fork error'); } else if ($pid) { //父进程会得到子进程号,所以这里是父进程执行的逻辑 echo "parent \n"; //等待子进程

  • 浅谈并发处理PHP进程间通信之System V IPC

    前言 它的安装和使用非常简单,在编译 PHP 时添加 --enable-sysvsem --enable-sysvshm --enable-sysvmsg 参数就可以,当然 Windows 上无法使用. 今天我们仍旧使用上一篇文章的例子来介绍 PHP 内部实现的进程间通信,在了解它们的具体使用之前,先简单介绍一下信号量.共享内存.消息队列的概念. Unix System V IPC 信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信.本质上,

  • php实现的简单多进程服务器类完整示例

    本文实例讲述了php实现的简单多进程服务器类.分享给大家供大家参考,具体如下: php写的一个简单的多进程服务器. <?php class server { public $port; public $ip; protected $server; public function __construct($ip = '0.0.0.0', $port) { $this->ip = $ip; $this->port = $port; $this->createSocket(); //创建

  • 浅谈并发处理PHP进程间通信之外部介质

    进程间通信 进程间通信,指至少两个进程或线程间传送数据或信号的一些技术或方法.进程是计算机系统分配资源的最小单位(严格说来是线程).每个进程都有自己的一部分独立的系统资源,彼此是隔离的.为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信. 根据定义可知,要进行进程间通信,我们需要解决两个问题: 互相访问:消息传输和暂时存储介质选择问题: 协调工作:消息的存取冲突问题: 文章介绍的中心就是围绕着这么两点来说的, 为了更使文章更简明,这边以之前在公司做的一个需求为例: 需要一个循环ID生

  • PHP 进程池与轮询调度算法实现多任务的示例代码

    phper 请了解进程调度策略,CPU 时间片,进程控制[创建,销毁,回收,进程信号]与及进程运行流程和基本的进程组,信号中断原理,以及进程之间的关系. 关于进程的更多内容可参考本人前面撸过的文章或是百度了解. 进程的通信: 匿名管道,命名管道,消息队列,内存共享,socketpair 请自行撸代码测试哦 进程的调度算法: 轮询,随机分发,计分板等策略或是搞个优先极或是队列,或是堆栈等基本的算法[自己去发挥哦] 进程池: 撸过 tcp 的话应该知道要能处理多个客户端,就得用 IO 复用技术[事件

  • PHP如何限制定时任务的进程数量

    前言 现在的工作中,经常要写一些脚本做一些异步的操作. 一般是大量的数据修改,或者解决部分并发问题. 为了能够稳定的做好数据处理,一般情况下会用定时脚本的方式. 那么问题来了. 可能存在的问题 当我们处理大量数据的时候,脚本的执行时间可能很长,或者重复处理某条数据(写错的情况下). 为了避免数据的重复处理.运行脚本过多导致服务器压力过大等问题,我们需要限制脚本的运行数量. 如何做 思路一 查询某种标识的进程数量,如果超过一定数量,则直接退出,不处理. 思路二 记录每次的PID,可以使用 文件.r

  • 一文看懂PHP进程管理器php-fpm

    php-fpm是什么 php-fpm是PHP的一个进程管理器.php下面的众多work进程皆有php-fpm进程管理器管理. php-fpm的工作原理 php-fpm全名是PHP FastCGI进程管理器.php-fpm启动后会先读php.ini,然后再读相应的conf配置文件,conf配置可以覆盖php.ini的配置. 启动php-fpm之后,会创建一个master进程,监听9000端口(可配置),master进程又会根据fpm.conf/www.conf去创建若干子进程,子进程用于处理实际的

  • nodeJS进程管理器pm2的使用

    pm2是一个带有负载均衡功能的Node应用的进程管理器.当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的. PM2是开源的基于Nodejs的进程管理器,包括守护进程,监控,日志的一整套完整的功能,基本是Nodejs应用程序不二的守护进程选择,事实上它并不仅仅可以启动Nodejs的程序,只要是一般的脚本的程序它同样可以胜任. 主要特性: 内建负载均衡(使用Node cluster 集群模块) 后台运行 0秒停机重载(这项功能允许你重新载入代码而

  • 一文看懂JAVA设计模式之工厂模式

    工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式.该模式用于封装和管理对象的创建,是一种创建型模式.本文从一个具体的例子逐步深入分析,来体会三种工厂模式的应用场景和利弊. 1. 简单工厂模式 该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装.该模式通过向工厂传递类型来指定要创建的对象,其UML类图如下: 下面我们使用手机生产来讲解该模式: Phone类:手机标准规范

  • 一文看懂JSONP原理和应用

    目录 什么是JSONP JSONP原理 JSONP具体实现 1.ajax中如果进行跨域请求会如何 2.使用JSONP,将前端代码中的ajax请求去掉 3.将前端代码再进行修改 4.最后jQuery提供了方便使用JSONP的方式 什么是JSONP 首先提一下JSON这个概念,JSON是一种轻量级的数据传输格式,被广泛应用于当前Web应用中.JSON格式数据的编码和解析基本在所有主流语言中都被实现,所以现在大部分前后端分离的架构都以JSON格式进行数据的传输. 那么JSONP是什么呢? 首先抛出浏览

  • 一文带你搞懂Python上下文管理器

    目录 一.什么是上下文管理器 二.如何实现上下文管理器 1. 通过类实现 1)_enter_ 2)_exit_ 2. 通过contextlib实现 总结 一.什么是上下文管理器 我们在处理文件的时候经常看到下面这样的代码,它即是上下文管理器: with open('test.txt', encoding='utf-8') as f: print(f.readlines()) 它的含义是打开当前目录下的test.txt文件并打印它里面的内容,与下面的代码效果是一样的: f = open('test

  • node.js应用后台守护进程管理器Forever安装和使用实例

    我们不可能直接通过node命令来管理远程站点,这样无法保证网站的可持续运行.我们用Forever来解决这个问题,它可以将NodeJS应用以后台守护进程的方式运行,我们还可以将NodeJS应用设成随系统启动而自动运行. 首先,安装Forever: 复制代码 代码如下: npm install forever -gd 这样Forever就安装好了,我们可以直接运行Forever命令: 复制代码 代码如下: forever --helpforever start app.jsforever stop

  • 一文看懂如何简单实现节流函数和防抖函数

    前言 在日常开发中有很多场景我们都需要用到节流函数和防抖函数,比如:实现输入框的模糊查询因为需要轮询ajax,影响浏览器性能,所以需要用到节流函数:实现手机号.姓名之类的的验证,往往我们只需要验证一次,这个时候我们就需要用到防抖函数:但是网上的很多资料都是不够具体和便于理解.今天自己翻阅了一些资料之后,来简单的谈谈我对节流函数和防抖函数的理解,希望能帮助大家理解: 节流函数 顾名思义,就是节省流量节省内存性能的一种函数,可以理解为是一种性能优化方案: 举个例子:一个水龙头一直在滴水,可能一次性会

  • 一文看懂springboot实现短信服务功能

    前言 上一篇讲了springboot 集成邮件服务,接下来让我们一起学习下springboot项目中怎么使用短信服务吧. 项目中的短信服务基本上上都会用到,简单的注册验证码,消息通知等等都会用到.所以我这个脚手架也打算将短息服务继承进来. 短息服务我使用的平台是阿里云的.网上有很多的短信服务提供商.大家可以根据自己的需求进行选择. 准备工作 在阿里云上开通服务,以及进行配置.这些阿里云官方文档都写的很清楚,怎么做就不细说的,大家可以参考一下这篇文章: https://www.jb51.net/a

  • 一文看懂C#中List的扩容机制

    一:背景 1. 讲故事 在前一篇大内存排查中,我们看到了Dictionary正在做扩容操作,当时这个字典的count=251w,你把字典玩的66飞起,其实都是底层为你负重前行,比如其中的扩容机制,当你遇到几百万甚至千万的大集合这个扩容机制还真的需要挖一下,免的入戏太深,难以自拔. 二:List扩容机制 1. 如何查看 要想看它的扩容机制,可以用ILSpy去看看List的源码即可,非常简单. 从源码的 int num = (_items.Length == 0) ? 4 : (_items.Len

  • windows下C#定时管理器框架Task.MainForm详解

    入住博客园4年多了,一直都是看别人的博客,学习别人的知识,为各个默默无私贡献自己技术总结的朋友们顶一个:这几天突然觉得是时候加入该队列中,贡献出自己微弱的力量,努力做到每个月有不同学习总结,知识学习的分享文章.以下要分享的是花了两天时间编写+测试的windows下C#定时管理器框架-Task.MainForm. 目的: 随着这五年在几个公司做不同职位的.net研发者,发现各个公司都或多或少会对接一些第三方合作的接口或者数据抓取功能,都是那种各个服务直接没有关联性功能,开发人员也可能不是一个人,使

随机推荐