php-fpm的工作机制 概括来说,fpm 的实现就是创建一个 master 进程,在 master 进程中创建并监听 socket,然后 fork 出多个子进程,这些子进程各自 accept 请求,子进程的处理非常简单,它在启动后阻塞在 accept 上,有请求到达后开始读取请求数据,读取完成后开始处理然后再返回,在这期间是不会接收其它请求的,也就是说 fpm 的子进程同时只能响应一个请求,只有把这个请求处理完成后才会 accept 下一个请求,这一点与 nginx 的事件驱动有很大的区别,nginx 的子进程通过 epoll 管理套接字,如果一个请求数据还未发送完成则会处理下一个请求 , 即一个进程会同时连接多个请求,它是非阻塞的模型,只处理活跃的套接字 。
fpm 的 master 进程与 worker 进程之间不会直接进行通信,master 通过共享内存获取 worker 进程的信息,比如 worker 进程当前状态、已处理请求数等,当 master 进程要杀掉一个 worker 进程时则通过发送信号的方式通知 worker 进程 。
fpm 可以同时监听多个端口,每个端口对应一个 worker pool,而每个 pool 下对应多个 worker 进程,类似 nginx 中 server 概念 。
在 php-fpm.conf 中通过[pool name]声明一个 worker pool:
启动 fpm 后查看进程:
具体实现上 worker pool 通过fpm_worker_pool_s这个结构表示 , 多个 worker pool 组成一个单链表
接下来看下 fpm 的启动流程,从main()函数开始:
fpm_init()主要有以下几个关键操作:
(1) fpm_conf_init_main():
解析 php-fpm.conf 配置文件,分配 worker pool 内存结构并保存到全局变量中:fpm_worker_all_pools,各 worker pool 配置解析到fpm_worker_pool_s-config中 。
(2)fpm_scoreboard_init_main():
分配用于记录 worker 进程运行信息的共享内存,按照 worker pool 的最大 worker 进程数分配 , 每个 worker pool 分配一个fpm_scoreboard_s结构,pool 下对应的每个 worker 进程分配一个fpm_scoreboard_proc_s结构 。
(3)fpm_signals_init_main():
这里会通过socketpair()创建一个管道 , 这个管道并不是用于 master 与 worker 进程通信的,它只在 master 进程中使用,具体用途在稍后介绍 event 事件处理时再作说明 。另外设置 master 的信号处理 handler,当 master 收到 SIGTERM、SIGINT、SIGUSR1、SIGUSR2、SIGCHLD、SIGQUIT 这些信号时将调用sig_handler()处理:
(4)fpm_sockets_init_main()
创建每个 worker pool 的 socket 套接字 。
(5)fpm_event_init_main():
启动 master 的事件管理 , fpm 实现了一个事件管理器用于管理 IO、定时事件,其中 IO 事件通过 kqueue、epoll、poll、select 等管理 , 定时事件就是定时器,一定时间后触发某个事件 。
在fpm_init()初始化完成后接下来就是最关键的fpm_run()操作了,此环节将 fork 子进程,启动进程管理器,另外 master 进程将不会再返回,只有各 worker 进程会返回,也就是说fpm_run()之后的操作均是 worker 进程的 。
在 fork 后 worker 进程返回了监听的套接字继续 main() 后面的处理,而 master 将永远阻塞在fpm_event_loop(),接下来分别介绍 master、worker 进程的后续操作 。
fpm_run()执行后将 fork 出 worker 进程 , worker 进程返回main()中继续向下执行,后面的流程就是 worker 进程不断 accept 请求 , 然后执行 PHP 脚本并返回 。整体流程如下:
worker 进程一次请求的处理被划分为 5 个阶段:
worker 处理到各个阶段时将会把当前阶段更新到fpm_scoreboard_proc_s-request_stage,master 进程正是通过这个标识判断 worker 进程是否空闲的 。
接下来我们来看下 master 是如何管理 worker 进程的,首先介绍下三种不同的进程管理方式:
推荐阅读
- 有人玩小米赛车的游戏吗,有人玩小米赛车的游戏吗视频
- gis导出cad信息,gis导出图纸
- lol开直播需要什么设置,lol开直播需要什么设置才能开
- vmos更改虚拟机版本,vmos虚拟机改型号
- go语言将会取代 go语言什么时候推出的
- 阿里巴巴全面支持鸿蒙系统,阿里用的什么系统
- js代码放外部不生效,js代码不能写在哪
- 手机怎么看淘宝客扣几个点,淘宝客怎么查
- php数据库优化处理6 php优化mysql方法