PHP-FPM是一种多进程模型,由master和worker组成
MASTER进程
当master进程启动时,会创建一个socket,但是他本身并不接收/处理请求。他会fork出子进程来完成请求的接收和处理。所以,master的主要职责是管理worker进程,比如fork出worker进程,或者kill掉worker进程。
master进程并不直接与worker进程进行通信,那么他是如何管理worker进程呢?实际上,master进程通过共享内存的方式来读取worker进程的状态信息,包括:worker进程当前状态,worker进程已经处理的请求数量等等。master进程会通过发送信号的方式来kill掉worker进程。
WORKER进程
Fpm中的worker进程的主要工作是处理请求。每个worker进程会竞争Accept请求,接收成功的那一个来处理本次请求。请求处理完毕后又重新进入等待状态。此处需要注意的是:一个worker进程在同一时刻只能处理一个请求。这与Nginx的事件驱动模型有很大的区别。Nginx的子进程使用epoll来管理socket,当一个请求的数据还未发送完成的话他就会处理下一个请求,即同一时刻,一个子进程会连接多个请求。而Fpm的这种子进程处理方式则大大简化了PHP的资源管理,使得在Fpm模式下我们不需要考虑并发导致的资源冲突。
- PHP-FPM和PHP的生命周期
PHP单进程的生命周期