## SAPI 运行模式
### CGI运行模式
- web服务器会根据请求的内容,fork一个子进程启动CGI程序,这里就是指PHP的解析器,PHP解析器程序启动后,它就会解析php.ini文件,初始化执行环境,然后解析动态脚本,再把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。当下次再有php任务请求时,再重复之前的操作。
- 每次处理请求都会重启cgi程序(PHP解析器),cgi程序需要解析php.ini等初始化工作,造成效率低下,服务器负担加重
### Fast-cgi运行模式
- FastCGI就像是一个常驻(long-live)型的CGI程序,它可以一直运行着。其主要行为是将CGI解释器进程保持在内存中并因此获得高效的性能。当客户端请求Web服务器上的动态脚本时,Web服务器会将动态脚本通过TCP协议交给FastCGI主进程,FastCGI主进程根据情况,安排一个空闲的子进程来解析动态脚本,处理完成后将结果返回给Web服务器,Web服务器再将结果返回给客户端。该客户端请求处理完毕后,FastCGI子进程并不会随之关闭,而是继续等待主进程安排工作任务
- 工作原理:
1. Web Server启动时载入FastCGI进程管理器(PHP的FastCGI进程管理器是PHP-FPM)
2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。
3. 当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
4. FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。在正常的CGI模式中,php-cgi.exe在此便退出了。
- 优点
1. 从稳定性上看, fastcgi是以独立的进程池运行来cgi,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分 配新的进程来运行逻辑。
2. 从安全性上看,Fastcgi支持分布式运算。FastCGI程序也可以和Web服务器分别部署在不同的主机上,它还可以接受来自其他Web服务器的请求。也就是说fastcgi和宿主的server完全独立, fastcgi宕掉不会影响到server。
3. 从性能上看, fastcgi把动态逻辑的处理从server中分离出来, 大负荷的IO处理留给宿主server, 这样宿主server可以一心一意处理IO。
### cli运行模式
- 即命令行运行模式,如在终端输入php a.php运行php文件或者直接输入 php -r “print\_r(get\_defined\_constants());” 执行php代码。
### web模块运行模式
- Web服务器内置模块,如apache的mod\_ php模块,微软iis的ISAPI,nginx的php-fpm,将php解释器做成模块加载到服务器中。这样,随着服务器的启动,PHP解释器模块也会随之启动。Apache的模块可以在运行的时候动态装载,这意味着对服务器可以进行功能扩展而不需要重新对源代码进行编译,甚至根本不需要停止服务器。我们所需要做的仅仅是给服务器发送信号HUP或者AP\_SIG\_GRACEFUL通知服务器重新载入模块。但是在动态加载之前,我们需要将模块编译成为动态链接库。此时的动态加载就是加载动态链接库。 Apache中对动态链接库的处理是通过模块mod\_so来完成的,因此mod\_so模块不能被动态加载,它只能被静态编译进Apache的核心,这意味着它是随着Apache一起启动的。
> php在Apache中的运行模式 ( web模块模式)
- 要让Apache处理并解析php请求,则需要在Apache的配置文件中加入"LoadModule php5\_module dir(php模块目录)",以告诉Apache在启动的时候载入php模块。
> php在Nginx中的运行模式(FastCGI模式)
- 在Linux中安装过Nginx的人会知道,如果要让Nginx服务器处理php请求,还需要安装php-fpm。PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)就是一个实现了Fastcgi的程序,并且提供进程管理的功能。
## PHP-FPM
### FPM信号处理
fpm的master进程与worker进程之间不会直接通讯,master通过共享内存获取worker进程信息,比如worker进程当前状态,已处理请求数等,当master进程要杀掉一个worker进程时则通过发送型号的方式通知worker进程
kill master进程,请求可以正常使用,因为是worker进程直接accept请求
kill worker进程,请求也是可以正常使用的,应为master进程会重新fock出worker进行。
### FPM三种模式
- **pm:static 固定进程模式**。
启动时master按照pm.max_children配置fork出相应数量的worker进程,即worker进程数是固定不变的。
- **pm:dynamic 动态进程模式**
首先再fpm启动按照pm.start_servers初始化一定数量的worker,运行期间如果master发现空闲worker数低于pm.min_spare_servers配置数(表示请求比较多,worker处理不多来了),则会forker worker进程,但总的worker数不能超过pm.max_childer,如果master发现空闲worker数超过pm.max_spare_servers(表示闲着的worker太多了),则会杀掉一些worker,避免占用过多资源,master通过这4个值来控制worker数
- **pm:ondemand**
在启动时不分配worker进程,等到有请求了再通知master进程forker worker进程,总的worker数不超过pm.max_children,处理完成后worker进程不会立即退出,当空闲时间超过pm.process_idle_time后再退出
### FPM模式生命周期

### Fast-cgi协议

- linux 基础
- ln 链接
- linux 环境变量
- linux 进程查看
- nginx
- redis
- redis 安装
- php 底层原理
- php源码编译安装
- phpize文件
- php命令行
- php7 新特性
- php7 变量
- php7 生命周期
- php sapi运行模式
- php 内存管理
- php 运行机制和Zend虚拟机
- php垃圾回收
- php 基础
- php.ini
- php函数
- 面向对象
- php 文件上传
- ob缓冲和页面静态化
- php中的session
- php cURL扩展
- composer 应用
- php 错误和异常
- thinkphp
- tp6容器和依赖注入
- tp6 的服务
- tp6事件
- tp6 多应用
- tp6路由
- tp6 cache
- tp6 request
- tp6 中间件
- tp6 response
- tp6 Db
- 备忘录
- 数据库表