同事发了一篇文档,里面提及
全文请参考: Nginx 与 FPM 的工作机制
我曾经认为Nginx也是由master负责派发请求给worker,但同事那边马上发了篇文档出来打脸,文章提到master只负责管理worker,如重启,重新加载配置文件,并不会派发请求。祥见:nginx平台初探
为什么我会纠结呢?
fpm
一开始其实是一个第三方管理软件,类似spawn-cgi
,说白了就是负责启动php-cgi
进程的,那PHP官方把它整合进来作为官方的php-cgi
管理工具后,会委以「派发请求」这样的重任吗?早上和同事一起纠结了一下,纠结过程如下:
strace -e network -p fpm_master_pid
strace -e network -p fpm_worker_pid
master进程并不接收和分发请求,而是worker进程直接accpet请求后poll处理.
master进程不断调用epoll_wait和getsockopt是用来异步处理信号事件和定时器事件.
这里提一下,Nginx也类似,master进程并不处理请求,而是worker进程直接处理, 不过区别在于Nginx的worker进程是epoll异步处理请求,而PHP-FPM仍然是poll.
kill -HUP fpm_master_pid
答:PHP源码分析 – PHP-FPM运行模式详解,看起来就是满足下面的条件就会执行 fpm_children_make
1. idle < pm_min_spare_servers
2. running_children < pm_max_children
3. MIN(MIN(idle_spawn_rate, pm_min_spare_servers - idle), pm_max_children - running_children) > 0
答:浅谈多进程程序的进程控制和管理方式,主要看「多进程下的套接字」,这段文字解释了为什么多进程不需要派发,因为它socket是多进程共享的
fpm的master并不承担派发请求的角色。
特别鸣谢纠结侠:郑导(C好厉害)