php-fpm回顾和总结
- 时间久了很容易忘,这里做个备份
- FastCGI协议php语言的实现,可以高效处理来自web端的动态请求
- php-fpm维护一个或者多个php-cgi进程池,处理请求时不需要频繁创建进程
- 所以比传统的CGI协议要更高效
技术架构
- 单master - 多worker
- master
- 非阻塞,异步IO模型
- 负责管理worker进程(创建、销毁、检查健康状态等)、监听连接、处理管理员发出的信号、启动时间循环等。
- master进程执行的四个阶段
- cgi初始化:外部信号hook注册、sapi全局变量初始化等;
- php环境初始化:加载和解析php.ini,加载php模块等;
- php-fpm初始化:加载和解析php-fpm.conf,初始化进程池等;
- php-fpm执行阶段:fork worker进程和启动事件循坏等。
- worker
- 阻塞模型
- 负责接收请求,处理请求,请求结束返回。
创建worker进程的三种方式
- static: 创建固定数目的worker进程,减少频繁创建进程的开销。
- dynamic: 动态调整worker进程数量,初始时会创建最低数目的worker进程,创建的进程数最大不超过设置的阈值。
- ondemand: 按需创建,来一个请求创建一个,请求处理完,进程结束。
master处理的信号说明
- SIGUSR1:重新打开日志文件,用于文件太大需要备份时的场景,重新打开不会清空原来的文件
- kill -s USR1 master进程id
- SIGUSR2: 重启fpm,包括master和worker,当配置文件更改时,则需要重启fpm让配置文件生效
- SIGQUIT: 平滑关闭fpm,worker处理完请求再退出
- SIGTERM/SIGINT: 强制关闭fpm,会影响当前正在处理的请求
多进程池配置形式
- 全局配置文件: php-fpm.conf
[global]
pid=run/php-fpm.pid
error_log=syslog
include=etc/php-fpm.d/*.conf
- 连接池1的配置文件: pool1.conf
[pool1]
listen = 127.0.0.1:9000
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
- 连接池2的配置文件: pool2.conf
[pool2]
#listen = /tmp/php-fcgi.sock
listen = 127.0.0.1:9001
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
管理脚本
#!/bin/bash
#
###################################
#
#@desc php-fpm进程管理
#
#@date 2019-04-04
#
#@author wadeyu
#
##################################
# master进程id保存路径
MASTER_PID_PATH=$PHP_HOME/var/run/php-fpm.pid
# php-fpm命令
PHP_FPM_CMD=$PHP_HOME/sbin/php-fpm
# 错误闪烁提醒
blinkRed(){
echo -e "\e[05m \e[1;31m $1 \e[0m"
}
# 错误提醒:red
errorTip(){
echo -e "\e[1;31m $1 \e[0m"
}
# 正常提醒:blue
normalTip(){
echo -e "\e[1;34m $1 \e[0m"
}
# 检查php-fpm配置是否正常
isCfgOk(){
$PHP_FPM_CMD -t
if [[ $? -gt 0 ]]; then errorTip "配置文件异常,请检查php-fpm配置文件!"
fi
return $?
}
# php-fpm正在运行中的主进程数量
getMainFpmCnt(){
if [[ ! -e $MASTER_PID_PATH ]]; then
return 0
fi
local pid=`cat $MASTER_PID_PATH`
local cnt=`ps -ef | grep php-fpm | awk -F ' ' '{print $2}' | grep $pid | wc -l`
return $cnt
}
# 检查php-fpm进程状态
checkStatus(){
if [[ ! -e $MASTER_PID_PATH ]]; then
errorTip "php-fpm 未运行(pid file not found)......"
return 1
fi
getMainFpmCnt
local cnt=$?
local sts=1
if [[ $cnt -eq 1 ]]; then
normalTip "php-fpm 正在运行中......"
sts=0
else
errorTip "php-fpm 未运行......"
fi
return $sts
}
# 启动php-fpm
startFpm(){
isCfgOk || exit 1
checkStatus && exit 2
normalTip "启动php-fpm进程......"
$PHP_FPM_CMD
checkStatus
}
# 停止php-fpm
stopFpm(){
checkStatus
if [[ $? -eq 1 ]]; then
return 0
fi
pid=`cat $MASTER_PID_PATH`
normalTip "停止php-fpm进程......"
kill -s QUIT $pid
getMainFpmCnt
local cnt=$?
while [[ $cnt -gt 0 ]]; do
sleep 1s
getMainFpmCnt
cnt=$?
done
normalTip "操作成功!"
}
# 重新加载配置
reloadFpm(){
checkStatus || exit 1
pid=`cat $MASTER_PID_PATH`
kill -s USR2 $pid
normalTip "reload信号已发出,等待一会儿配置生效"
}
case "$1" in
start)
startFpm
;;
stop)
stopFpm
;;
reload)
reloadFpm
;;
restart)
stopFpm
startFpm
;;
status)
checkStatus
;;
*)
echo "Usage $0 {start|stop|reload|restart|status}"
exit 99
esac
参考资料
- php-fpm.conf官方配置说明
- php-fpm的进程pool设置
- PHP源码分析 - PHP-FPM运行原理
- PHP-FPM源码分析
- php-fpm信号
- php-fpm服务启动脚本
- shell判断文件是否存在
- SHELL输出颜色和闪烁控制
php-fpm回顾和总结的更多相关文章
- FPM定制RPM包实践
1.1 快速部署方案 ✔ 问题:当领导给你 100 台已经安装好系统的服务器,然后让优化,让你提出一个快速部署方案. 解答: 1.tar 打包 先编译安装 打包-->分发-->解包(比如 ...
- FPM工具 实战定制nginx包
FPM主要特点: 把一种包打包成另一种包的格式 支持的源类型包 DIR 将目录打包成所需要的类型,可以用于源码编译的安装包. RPM 对rpm进行转换 gem 对rubygem包进行转换. ...
- [C#] C# 基础回顾 - 匿名方法
C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...
- SQL Server-表表达式基础回顾(二十四)
前言 从这一节开始我们开始进入表表达式章节的学习,Microsoft SQL Server支持4种类型的表表达式:派生表.公用表表达式(CTE).视图.内嵌表值函数(TVF).简短的内容,深入的理解, ...
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- [C#] C# 知识回顾 - 学会处理异常
学会处理异常 你可以使用 try 块来对你觉得可能会出现异常的代码进行分区. 其中,与之关联的 catch 块可用于处理任何异常情况. 一个包含代码的 finally 块,无论 try 块中是否在运行 ...
- [C#] C# 知识回顾 - 学会使用异常
学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...
- [C#] C# 知识回顾 - 异常介绍
异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...
- [.NET] C# 知识回顾 - Event 事件
C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...
- [.NET] C# 知识回顾 - 事件入门
C# 知识回顾 - 事件入门 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6057301.html 序 之前通过<C# 知识回顾 - 委托 de ...
随机推荐
- APK瘦身-是时候给App进行减负了
前言 APK瘦身即是对APK大小进行压缩策略,减小APK安装包大小,更小的安装包更有助于吸引用户安装.前一段时间我司某一App进行APK的瘦身,最终也达到了减小10M的目标,现做一个简单的总结记录. ...
- Apache Tomcat 之路(三 部署多个应用)
想要在一台服务器上部署多个web应用的时候有两种部署方式:1.拷贝多个tomcat 服务器,每个服务器启动不同的web应用;2.一个tomcat容器部署多个web应用 两种方式的优缺点:多个tomca ...
- mac 下使用gcc 编译c函数
mac 终端其实和window 的cmd类似,由于mac 的os x 采用了unix 系统,所以,各种类似UNIX下的命令都有用.最近在看computer science ,用到了命令行. 下面是一个 ...
- [翻译] API测试最佳实践 - 身份验证(Authentication)
API测试最佳实践 - 身份验证 适用等级:高级 1. 概况 身份验证通常被定义为是对某个资源的身份的确认的活动,这里面资源的身份指代的是API的消费者(或者说是调用者).一旦一个用户的身份验证通过了 ...
- contact用法解析
经典用法: mysql> select concat('11','22','33'); +------------------------+ | concat('11','22','33') | ...
- wps 图片代码 复制 粘贴
<table><tr><td><img src="C:\Users\Administrator\Desktop\QQ截图20160921180946 ...
- html5开发移动混合App系列1-开发环境搭建
最近公司准备开发门店收银系统,是基于IPAD的程序,决定采用基于 Ionic + Cordova + AngularJS技术混合开发模式. 准备 一台mac(安装了mac os的虚拟机也可以),nod ...
- [6818开发板]八核开发板|4G开发板|GPS开发板|嵌入式开发平台
IMX6开发板(基本型):960元 IMX6开发板(豪华型):1460元 S5P4418 核心板可以无缝支持核心系统S5P6818,并保持底板设计不变,将兼顾更高端 的应用领域,为项目和产品提供更好的 ...
- app dcloud 打包公用证书
Android平台云端打包使用的DCloud公用证书 分类:HTML5+ 5+App开发 HBuilder|HBuilderX应用云端打包Android平台默认使用的DCloud公用证书,其信息如下: ...
- CREATE OPERATOR - 定义一个新的操作符
SYNOPSIS CREATE OPERATOR name ( PROCEDURE = funcname [, LEFTARG = lefttype ] [, RIGHTARG = righttype ...