原文地址: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的更多相关文章

  1. PHP7 源码整体框架

    一.PHP7语言执行原理 常用的高级语言有很多种,根据运行的方式不同,大体分为两种:编译型语言和解释型语言. 编译是指在应用源程序执行之前,就将程序源代码“翻译”成汇编语言,然后进一步根据软硬件环境编 ...

  2. PHP 的 SAPI 是个什么东西(转)

     SAPI,是 Server Application Programming Interface 的首字母缩写,意思是服务器端应用编程接口. 这是 PHP 内核提供给外部调用其服务的接口,即外部系统可 ...

  3. 总结七条助你成为Linux高手的超棒忠告

    起初Linux对于我来说其实是很纠结的,因为很早以前就听说过.也曾见各种技术大牛使用过,但是一直觉得非常高深而没有去正式接触.两年前随着自己工作愈发的乏味,又看到了一篇叫做"虽然我是医生,但 ...

  4. php内核探索

    http://www.nowamagic.net/librarys/veda/special/PHP%E5%86%85%E6%A0%B8%E6%8E%A2%E7%B4%A2 关注PHP 源代码 Zen ...

  5. 新建node工程

    之前各种node工程都是东抄抄,西抄抄的.  用ng的cli之后,发现非常舒服.所以把node新建工程的种种记录一下. node+babel, 直接按es6标准写就好了,  不需要一定写ts再转码了( ...

  6. Angular2入门体验

    好的工具往往使得开发应用更快更简单,而不是任何模块都手动开发.angualr cli就是一个支持 创建工程,添加文件,对各种任务如测试.打包.部署等迭代. 本文的目的就是基于TypeScript开发构 ...

  7. 跟厂长学PHP7内核(三):源码目录结构

    上篇文章我们已经介绍了源码分析工具的安装.配置以及调试方法,本文我们来讲述一下PHP源码的目录结构. 一.目录概览 以php-7.0.12为例,看过源码的同学们应该发现源码目录多达十多个,下面是每个目 ...

  8. 附录A 思科互联网络操作系统(IOS)

    思科互联网络操作系统(IOS) 要点 实现IP编址方案和IP服务,以满足中型企业分支机构网络的网络需求 口在路由器上配置和验证 DHCP和DNS 以及排除其故障(包括 CLI/SDM ). 口配置和验 ...

  9. [视频教程] 最新版swoole安装和TASKS功能测试

    今天我们来安装和测试一下php的多并发高性能网络通信扩展,这个扩展是使用C语音开发的,加载到PHP以后,在PHP的层面上实现了多并发异步通信,模拟了go语音的很多特性,极大的拓宽了PHP的应用场景. ...

随机推荐

  1. 学习Microsoft Visio(2)

    常用业务设计图示法 一.业务设计基础 1.名词概念 业务流程图:在公司.部门.岗位的层面上描述一个业务流程的宏观过程. 基本流程图:对某个处理过程的详细逻辑流程进行描述. 静态业务对象图(UML表示法 ...

  2. linux中添加自定义命令

    centos下设置alias别名,比较简单,例如: vim /root/.bashrc addalias rm='rm -i' Linux alias设置指令的别名命令详解 功能说明:设置指令的别名. ...

  3. STM32启动代码详细分析

    最近需要学习iap的功能,因此离不开stm32的启动代码的分析,以前看了很多遍,都看不懂,读书百遍,其义自见,因此我有看了一遍,下面的文章,挺好的,因此转载: 在上电复位后,我们都知道会先运行启动代码 ...

  4. 实训作业6 (数据I/O)

    1. 文件输出流的应用. 定义如下字符串: String str = “12345abcdef@#%&*软件工程”; 编写程序将该字符串写入文件”data.txt”. import java. ...

  5. js解决大文件断点续传

    最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

  6. 洛谷P3509 Frog

    题目 首先分析数据范围发现m很大,所以线性做法肯定不行,因此考虑倍增,即预处理出每个点跳1次后的位置.然后只用两个数组类似于快速幂,推出每个点跳m次后的位置. 预处理离每个点第k小的点,可以用长度为k ...

  7. Android入门教程(二)

    Hello World 项目 首先当我们启动Android Studio的虚拟机时,可以看到第一个项目Hello World,那么虚拟机中的Hello World!是如何书写的呢? 看看虚拟机运行结果 ...

  8. 初识 Python 作业及默写

    1.简述变量量命名规范 2.name = input(“>>>”) name变量是什么数据类型? 3.if条件语句的基本结构? 4.用print打印出下面内容: 文能提笔安天下, 武 ...

  9. Nessus简单使用

    1.更新插件 上次搭建完后总觉得不踏实,因为老是提示插件多久没更新了,然后果断花了1.25美刀买了台vps,终于把最新的插件下载下来了,总共190M,需要的QQ私信我.

  10. fluent计算输出时均值

    / ****************************************************************************** * Created on : 2017 ...