PHP7内核CGI与FastCGI详解


Posted in PHP onApril 14, 2019

CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。
FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。

PHP-CGI:是 PHP (Web Application)对 Web Server 提供的 CGI 协议的接口程序。

PHP-FPM:是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序,额外还提供了相对智能一些任务管理

CGI工作流程

1.如果客户端请求的是 index.html,那么Web Server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。

2.当Web Server收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。

FastCGI工作流程

1.如果客户端请求的是 index.html,那么Web Server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。

2.当Web Server收到 index.php 这个请求后,FastCGI程序(FastCGI在启动时就初始化执行执行环境,每个CGI进程池各个CGI进程共享执行环境)在CGI进程池中选择一个CGI进程处理请求,再以规定CGI规定的格式返回处理后的结果,继续等待下一个请求。

PHP-FPM基本实现

1.PHP-FPM的实现就是创建一个master进程,在master进程中创建worker pool并让其监听socket,然后fork出多个子进程(work),这些子进程各自accept请求,子进程的处理非常简单,它在启动后阻塞在accept上,有请求到达后开始读取请求数据,读取完成后开始处理然后再返回,在这期间是不会接收其它请求的,也就是说PHP-FPM的子进程同时只能响应一个请求,只有把这个请求处理完成后才会accept下一个请求

2.PHP-FPM的master进程与worker进程之间不会直接进行通信,master通过共享内存获取worker进程的信息,比如worker进程当前状态、已处理请求数等,当master进程要杀掉一个worker进程时则通过发送信号的方式通知worker进程。

3.PHP-FPM可以同时监听多个端口,每个端口对应一个worker pool,而每个pool下对应多个worker进程

PHP7内核CGI与FastCGI详解

Worker工作流程

1.等待请求: worker进程阻塞在fcgi_accept_request()等待请求;

2.解析请求: fastcgi请求到达后被worker接收,然后开始接收并解析请求数据,直到request数据完全到达;

3.请求初始化: 执行php_request_startup(),此阶段会调用每个扩展的:PHP_RINIT_FUNCTION();

4.编译、执行: 由php_execute_script()完成PHP脚本的编译、执行;

5.关闭请求: 请求完成后执行php_request_shutdown(),此阶段会调用每个扩展的:PHP_RSHUTDOWN_FUNCTION(),然后进入步骤(1)等待下一个请求。

Master进程管理

1.static: 这种方式比较简单,在启动时master按照pm.max_children配置fork出相应数量的worker进程,即worker进程数是固定不变的

2.dynamic: 动态进程管理,首先在fpm启动时按照pm.start_servers初始化一定数量的worker,运行期间如果master发现空闲worker数低于pm.min_spare_servers配置数(表示请求比较多,worker处理不过来了)则会fork worker进程,但总的worker数不能超过pm.max_children,如果master发现空闲worker数超过了pm.max_spare_servers(表示闲着的worker太多了)则会杀掉一些worker,避免占用过多资源,master通过这4个值来控制worker数

3.ondemand: 这种方式一般很少用,在启动时不分配worker进程,等到有请求了后再通知master进程fork worker进程,总的worker数不超过pm.max_children,处理完成后worker进程不会立即退出,当空闲时间超过pm.process_idle_timeout后再退出

PHP-FPM事件管理器

1.sp[1]管道可读事件:这个事件是master用于处理信号的

2.fpm_pctl_perform_idle_server_maintenance_heartbeat():这是进程管理实现的主要事件,master启动了一个定时器,每隔1s触发一次,主要用于dynamic、ondemand模式下的worker管理,master会定时检查各worker pool的worker进程数,通过此定时器实现worker数量的控制

3.fpm_pctl_heartbeat():这个事件是用于限制worker处理单个请求最大耗时的,php-fpm.conf中有一个request_terminate_timeout的配置项,如果worker处理一个请求的总时长超过了这个值那么master将会向此worker进程发送kill -TERM信号杀掉worker进程,此配置单位为秒,默认值为0表示关闭此机制

4.fpm_pctl_on_socket_accept():ondemand模式下master监听的新请求到达的事件,因为ondemand模式下fpm启动时是不会预创建worker的,有请求时才会生成子进程,所以请求到达时需要通知master进程

PHP 相关文章推荐
PHP Google的translate API代码
Dec 10 PHP
php smarty模版引擎中变量操作符及使用方法
Dec 11 PHP
保存到桌面、设为桌面且带图标的PHP代码
Nov 19 PHP
PHP上传图片进行等比缩放可增加水印功能
Jan 13 PHP
php实现aes加密类分享
Feb 16 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
Jul 23 PHP
php+xml编程之xpath的应用实例
Jan 24 PHP
一个PHP实现的轻量级简单爬虫
Jul 08 PHP
PHP导出带样式的Excel示例代码
Aug 28 PHP
PHP实现表单提交时去除斜杠的方法
Dec 26 PHP
Yii2第三方类库插件Imagine的安装和使用
Jul 06 PHP
php实现简单的守护进程创建、开启与关闭操作
Aug 13 PHP
Codeigniter里的无刷新上传的实现代码
Apr 14 #PHP
PHP7中I/O模型内核剖析详解
Apr 14 #PHP
浅析PHP7的多进程及实例源码
Apr 14 #PHP
什么是PHP7中的孤儿进程与僵尸进程
Apr 14 #PHP
php intval函数用法总结
Apr 14 #PHP
PHP中上传文件打印错误错误类型分析
Apr 14 #PHP
PHP扩展Swoole实现实时异步任务队列示例
Apr 13 #PHP
You might like
一个php导出oracle库的php代码
2009/04/20 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
2013/11/07 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
PHP实现的观察者模式实例
2017/06/21 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
js更优雅的兼容
2010/08/12 Javascript
利用div+jquery自定义滚动条样式的2种方法
2013/07/18 Javascript
javascript常见操作汇总
2014/09/03 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
JavaScript事件委托用法分析
2015/01/24 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
使用vue.js编写蓝色拼图小游戏
2017/03/17 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
详解vue-element Tree树形控件填坑路
2019/03/26 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
Python实现将16进制字符串转化为ascii字符的方法分析
2017/07/21 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
带你认识HTML5中的WebSocket
2015/05/22 HTML / CSS
重新定义牛仔布,100美元以下:Warp + Weft
2018/07/25 全球购物
英国领先的游戏零售商:GAME
2019/09/24 全球购物
高三学习决心书
2014/03/11 职场文书
让生命充满爱演讲稿
2014/05/10 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
党员对十八届四中全会的期盼思想汇报范文
2014/10/17 职场文书
谢师宴邀请函
2015/02/02 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
学期个人工作总结
2015/02/13 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书