深入理解-CLI与PHP-FPM
原文地址:https://blog.csdn.net/lzx_victory/article/details/85917161
PHP-FPM模式相对于CLI比较复杂,因为PHP-FPM为常驻进程不断处理请求,因此二者只是在执行流程略有不同.
PHP-FPM
现在PHP广泛被使用的一种模式,用于解析FastCGI协议,执行相应的请求.
PHP-FPM 三种模式
static
FPM启动根据pm.max_children固定的woker进程数.
dynamic
FPM是启动的woker进程是变化:根据参数pm.start_servers~pm.max_children之间的.
pm.min_spare_servers~pm.min_spare_servers指明可空闲进程的个数,空闲进程数超过pm.min_spare_servers就会被kill掉.
ondemand
启动时不分配Woker进程,根据pm.process_idle_timeout空闲时间后会把进程kil掉.也受到pm.max_children的限制.
其余参数设置
pm.max_requests = 1000
#设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用. 如果设置为 '0' 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.
pm.status_path = /status
#FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none. munin监控会使用到 rlimit_files = 1024
#设置文件打开描述符的rlimit限制. 默认值: 系统定义值默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。
Frok流程
当PHP-FPM启动后calling process会fork master进程,然后Fork worker.
Worker: 实际处理请求的进程.
Master: 管理worker进程,对worker进程重启,关闭等操作.
Master进程
Master通过监听"外部信号"与Woker进程的信号(SIGHLD:Woker进程发送信号,Master进程处理善后工作,然后在按照模式启动),对相应的信号来管理Worker进程.
信号机制:Master采用了socketpair一端写入信号事件,另一端在注册到事件机制中,在Master Loop读取事件,调用回调函数(fpm_got_signal)执行对应的信号.
FPM内部对事件进行了封装,用于支持不同的事件模型,例如epoll,select,kqueue等.
Master进程还有重要的作用统计所有Worker进程的信息,用于统计的数据结构叫做计分板.
Woker进程
Woker进程,特殊处理的信号只有SIGQUIT,其余的都是执行默认信号处理(SIG_DFL).
当收到SIGQUIT时,in_shutdown静态全局变量置为1,确保在fcgi_accept_request方法返回-1,不在accept新的请求并结束相应的Woker进程.
每个Woker进程存在于一个进程池内,根据FPM可以配置多个进程池.
每个Worker进程进行accept时会阻塞并接收一个请求.每个Woker进程执行accept函数在Linux2.6内核版本不会形成惊群效应.
FCGI协议
FCGI是一种交互式协议,基于CGI协议的一种变体.在每次请求到达是不需要新建进程,减少了进程创建以及销毁的资源损耗.
每次FastCGI请求成为Record由以下结构组成:
BeginRequestRecord:包含请求的信息,请求ID,以及请求的角色等.
EndRequestBody:请求结束的标识,包含最终Appliancation返回处理状态.
Header:被包含EndRequestBody,BeginRequestRecord,以及以及类型当中.每个数据段需要由Header指定这个段的类型,RequestID以及长度…
/*
* Values for type component of FCGI_Header
*/
#define FCGI_BEGIN_REQUEST 1
#define FCGI_ABORT_REQUEST 2
#define FCGI_END_REQUEST 3
#define FCGI_PARAMS 4//key value 类型.
#define FCGI_STDIN 5
#define FCGI_STDOUT 6
#define FCGI_STDERR 7
#define FCGI_DATA 8
#define FCGI_GET_VALUES 9
#define FCGI_GET_VALUES_RESULT 10
#define FCGI_UNKNOWN_TYPE 11
#define FCGI_MAXTYPE (FCGI_UNKNOWN_TYPE)
typedef struct {
unsigned char version;
unsigned char type;
unsigned char requestIdB1;
unsigned char requestIdB0;
unsigned char contentLengthB1;
unsigned char contentLengthB0;
unsigned char paddingLength;
unsigned char reserved;
} FCGI_Header;
FCGI协议详述,这里有详细的介绍以及示例.
CLI 与 PHP-FPM执行流程
PHP-FPM
CLI
CLI也是最常用的一种模式,我们来看下他执行的过程.
1.php_module_start_up:将sapi_globals中的成员变量进行初始化.
2.php_request_start_up:将zend引擎的编译器,扫描器,编译器等进行初始化.
3.php_excute_script:读取代码并扫描词法和语法生成AST,初始化op_array并将AST编译生成opcode,设置op_array对应的handler,然后执行opcode.
4.php_request_shutdown:调用各模块的析构函数,输出缓冲区调用扩展的RSHUTDOWN函数.销毁全局变量,关闭解析器.
5.php_module_shutdown:在php_module_startup初始化的内容要进行销毁.
深入理解-CLI与PHP-FPM的更多相关文章
- PHP7 源码整体框架
一.PHP7语言执行原理 常用的高级语言有很多种,根据运行的方式不同,大体分为两种:编译型语言和解释型语言. 编译是指在应用源程序执行之前,就将程序源代码“翻译”成汇编语言,然后进一步根据软硬件环境编 ...
- PHP 的 SAPI 是个什么东西(转)
SAPI,是 Server Application Programming Interface 的首字母缩写,意思是服务器端应用编程接口. 这是 PHP 内核提供给外部调用其服务的接口,即外部系统可 ...
- 总结七条助你成为Linux高手的超棒忠告
起初Linux对于我来说其实是很纠结的,因为很早以前就听说过.也曾见各种技术大牛使用过,但是一直觉得非常高深而没有去正式接触.两年前随着自己工作愈发的乏味,又看到了一篇叫做"虽然我是医生,但 ...
- php内核探索
http://www.nowamagic.net/librarys/veda/special/PHP%E5%86%85%E6%A0%B8%E6%8E%A2%E7%B4%A2 关注PHP 源代码 Zen ...
- 新建node工程
之前各种node工程都是东抄抄,西抄抄的. 用ng的cli之后,发现非常舒服.所以把node新建工程的种种记录一下. node+babel, 直接按es6标准写就好了, 不需要一定写ts再转码了( ...
- Angular2入门体验
好的工具往往使得开发应用更快更简单,而不是任何模块都手动开发.angualr cli就是一个支持 创建工程,添加文件,对各种任务如测试.打包.部署等迭代. 本文的目的就是基于TypeScript开发构 ...
- 跟厂长学PHP7内核(三):源码目录结构
上篇文章我们已经介绍了源码分析工具的安装.配置以及调试方法,本文我们来讲述一下PHP源码的目录结构. 一.目录概览 以php-7.0.12为例,看过源码的同学们应该发现源码目录多达十多个,下面是每个目 ...
- 附录A 思科互联网络操作系统(IOS)
思科互联网络操作系统(IOS) 要点 实现IP编址方案和IP服务,以满足中型企业分支机构网络的网络需求 口在路由器上配置和验证 DHCP和DNS 以及排除其故障(包括 CLI/SDM ). 口配置和验 ...
- [视频教程] 最新版swoole安装和TASKS功能测试
今天我们来安装和测试一下php的多并发高性能网络通信扩展,这个扩展是使用C语音开发的,加载到PHP以后,在PHP的层面上实现了多并发异步通信,模拟了go语音的很多特性,极大的拓宽了PHP的应用场景. ...
随机推荐
- 08 c++中运算符重载(未完成)
参考:轻松搞定c++语言 定义:赋予已有运算符多重含义,实现一名多用(比较函数重载) 运算符重载的本质是函数重载 重载函数的格式: 函数类型 operator 运算符名称(形参表列) { 重载实体 ...
- webpack脚手架增加版本号
1.product模式下,新增版本号: 1)common.js文件中,输出的文件路径要跟着变化 output: { filename: 'js/[name].js', path: path.resol ...
- HTTP Status 500 - DateConverter does not support default String to 'Date' conversion.错误
//自己指定一个类型转换器(将String转成Date) DateConverter converter = new DateConverter(); converter.setPattern(new ...
- ActiveMQ-启动服务异常
如果报这种异常: Caused by: java.io.IOException: Failed to bind to server socket: tcp://0.0.0.0:61616?maximu ...
- 《团队作业第三、四周》五阿哥小组Scrum 冲刺阶段---Day3
<团队作业第三.四周>五阿哥小组Scrum 冲刺阶段---Day3 一.项目燃尽图 二.项目进展 20182310周烔今日进展: 主要任务一览:界面布局的设计 20182330魏冰妍今日进 ...
- linux 查看某个目录下文件的数量
今日思语:时间是个庸医,却自称能包治百病~ 在linux环境下,经常需要查看某个文件目录下的文件数有多少,除了进入当前目录下查看,还可以使用命令: ls -l | grep "^-" ...
- SpringCloud微服务
SpringCloud SpringCloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.负载均衡.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运行 ...
- LG1036
当我们看到这道题的时候,我们不仅大吼一声,这不就是搜索嘛. 于是搜索两大刀!搜索目标和搜索状态! 搜索目标:求选数的方案,以及他们的和是否为质数. 搜索状态: 1.从后往前分析目标(或从前往后):和是 ...
- rhcsa备战笔记
笔记全部手打 转载请加原文链接 0)重置密码开机按e 找到linux16行 rd.break console=tty0 ctrl+xmount -o remount,rw /sysrootchroo ...
- asp.net大附件上传,支持断点续传
以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传 ...