原文地址: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. vs code 搭建java maven springboot环境

    Java Extension Pack,Maven for Java,Spring Boot Extension Pack https://blog.csdn.net/qq_26026975/arti ...

  2. 状压dp之位运算

    ## 一.知识 1.我们知道计算机中数据由二进制数存储,一个二进制数的一位就是计算机中数据的最小单位bit,我们有一种运算符可直接对二进制数进行位运算,所以它的速度很快. 2.C++中的位运算符有6种 ...

  3. 07. vue-router嵌套路由

    嵌套路由用法 1.嵌套路由功能分析 点击父级路由链接显示模板内容 模板内容中又有子级路由链接 点击子级路由链接显示子级模板内容 2.父路由组件模板 父级路由链接 父组件路由填充位 <p> ...

  4. Maven和Ajax

    ****************使用maven构建项目******************** 一个maven项目必须要有一个pom文件. maven中常用的命令: 在使用mvn archetype: ...

  5. janusgraph-创建索引出现GraphIndexStatusReport[success=false, indexName='mixedvlabel', targetStatus=[REGISTERED], notConverged={vlabel=INSTALLED}, converged={}, elapsed=PT1M0.07S]

    参考网址: https://www.cnblogs.com/Uglthinx/p/9630779.html 原因:我的是事务没有完全关闭 解决办法: 创建一个混合索引: // 在graph中有事务执行 ...

  6. Uva11762 Race to 1——有向无环图&&记忆化搜索

    题意 给出一个整数 $N$,每次可以在不超过 $N$ 的素数中等概率随机选择一个 $P$,如果 $P$ 是 $N$ 的约数,则把 $N$ 变成 $N/P$,否则 $N$ 不变.问平均情况下需要多少次随 ...

  7. Java 用Jackson进行json和object之间的转换(并解决json中存在新增多余字段的问题)

    1.添加jackson库 如果是maven工程,需要在pom.xml中添加jackson的依赖: <dependency>      <groupId>com.fasterxm ...

  8. 洛谷P1560 蜗牛的旅行

    题目 搜索,注意判断特殊情况,并且区分开什么时候转弯什么时候停止.然后转弯的时候更是要注意是否会进入障碍. #include <bits/stdc++.h> using namespace ...

  9. HEXO快速搭建自己的博客

    关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 很多人有自己的博客,那么你想要吗?利用Hexo就可以搭建专属自己 ...

  10. 02-线性结构3 Reversing Linked List (25 分)

    Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elem ...