PHP-FPM及其三种运行方式
php-fpm和FastCGI是什么?
fpm的基本实现
worker工作流程
fpm启动流程部分源码
php-fpm运行的三种模式
`static`模式:静态模式
`ondemand` 模式:按需分配模式
`dynamic`模式:动态模式
总结
php-fpm和FastCGI是什么?
PHP-FPM(FastCGI Process Manager)是一个PHPFastCGI进程管理器,从其英文名称和定义可以看出,FPM的核心功能就是进程管理。
FastCGI可以理解为一种协议,用于web服务器(nginx、Apache)和处理程序间进行通信,是一种应用层通信协议。
工作原理大致如下图
fpm的基本实现
简单来说,fpm的实现就是创建一个master进程,在master进程中创建worker pool并监听socket,然后fork出多个子进程(work),这些worker在启动后阻塞在fcgi_accept_request()上,各自accept请求,有请求到达后worker开始读取请求数据,读取完成后开始处理然后再返回,在这期间是不会接收其它请求的,也就是说fpm的子进程同时只能响应一个请求,只有把这个请求处理完成后才会accept下一个请求。
fpm的master进程与worker进程之间不会直接进行通信,master通过共享内存获取worker进程的信息,比如worker进程当前状态、已处理请求数等,当master进程要杀掉一个worker进程时则通过发送信号的方式通知worker进程。
fpm可以同时监听多个端口,每个端口对应一个worker pool,而每个pool下对应多个worker进程,类似nginx中server概念, 在php-fpm.conf中可以配置多个,例如:
[web1]
listen:127.0.0.1:9000
[web2]
listen:127.0.0.1:9001
大致原理如下图
php-fpm源码结构
struct fpm_worker_pool_s {
struct fpm_worker_pool_s *next; //指向下一个worker pool
struct fpm_worker_pool_config_s *config; //conf配置:pm、max_children、start_servers...
...
struct fpm_child_s *children; //当前pool的worker链表
int running_children; //已启动的进程数
int idle_spawn_rate;//空闲率
int warn_max_children;//最大work值
struct fpm_scoreboard_s *scoreboard; //记录worker的运行信息,比如空闲、忙碌worker数
...
}
1
2
3