php cgi是什么意思(PHP7内核CGI与FastCGI详解)
php cgi是什么意思
PHP7内核CGI与FastCGI详解
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进程
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进程
- apachephp环境搭建(apache集成php7.3.5的详细步骤)
- php脚本控制方法(php swoole多进程/多线程用法示例基于php7nts版)
- php7优化技巧(php7性能提升的原因详解)
- centos安装php5.6(Centos7 Yum安装PHP7.2流程教程详解)
- phpstudy使用教程学习(phpStudy 2016 使用教程详解支持PHP7)
- php7用什么替代mysql(mysqli扩展无法在PHP7下升级问题的解决)
- php7语法代码规范(PHP7新功能总结)
- 在php中与数据库连接的技术(PHP7.0连接DB操作实例分析基于mysqli)
- linux如何安装php7.1.5环境(vmware linux系统安装最新的php7图解)
- php7 入门(php7新特性的理解和比较总结)
- php7.4编译安装(PHP7.3.10编译安装教程)
- php7.4 废弃功能(浅析PHP7 的垃圾回收机制)
- php7.4类型属性实例详解(PHP 7.4中使用预加载的方法详解)
- 宝塔linux面板php7.0安装不上(宝塔面板php.ini文件在哪里找)
- php中的内置函数(php7下的filesize函数)
- php 5与7有什么改变(php5与php7的区别点总结)
- 小米音乐可绑定QQ音乐, QQ音乐 真的会消失在小米的设备上吗(小米音乐可绑定QQ音乐)
- 小米Watch S1评测 或许能成为小米冲击高端可穿戴设备的里程碑(小米WatchS1评测或许能成为小米冲击高端可穿戴设备的里程碑)
- 手机QQ与小米路由器在一起 明天揭晓,敬请期待(手机QQ与小米路由器在一起)
- 小米音乐与 QQ 音乐合作,便捷迁移会员(小米音乐与QQ音乐合作)
- 小米推出米兔儿童电话手表奥特曼版,799 元,支持微信 QQ(小米推出米兔儿童电话手表奥特曼版)
- 贾怀胤唱《白龙马》 炸场 了 没想到京剧还能这么玩(贾怀胤唱白龙马)
热门推荐
- docker如何搭建gitlab(docker+gitlab+gitlab-runner部署详解)
- js怎么做一个计时器(JavaScript实现简单计时器)
- 阿里云ecs开放所有端口(阿里云ECS实例挂载PE盘使用chroot命令提示“I have no name”错误的解决方法)
- php入门基本笔记(PHP之认识二关于Traits的用法详解)
- php框架使用方法大全(PHP MVC框架中类的自动加载机制实例分析)
- mysql数据库简单操作(一篇文章教会你进行MySQL数据库和数据表的基本操作)
- win10下ftp服务器怎么配置(个人主机如何搭建FTP服务器?win10版本)
- 常见的浏览器兼容性测试工具
- 微信小程序ui聊天窗口(微信小程序实现简单聊天室)
- dede织梦的后台如何调整和使用(织梦DEDECMS中增加父栏目调用,以及多级支持currentstyle的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9