🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # FPM模式的生命周期 >作为php应用程序开发者,我们只需要了解以下知识即可,不理解不影响对Swoole的学习。 通过我们之前对运行模式的了解,我们知道FPM是常驻内存的进程,所以其模块初始化只做一次,便进入循环,而模块关闭在进程退出时也只做一次。这样更方便我们了解FPM的生命周期: 1)调用php_module_startup,加载所有模块。 2)进入循环,调用fcgi_accept_request实际调用的是accept,阻塞等待请求;如果有请求进来,会被唤起,进入php_request_startup,初始化请求。为了防止多个进程对accept进行抢占,出现“惊群”情况,增加了锁机制: ```C FCGI_LOCK(req->listen_socket); req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len); FCGI_UNLOCK(req->listen_socket); ``` >惊群效应是指多进程(多线程)在同时阻塞等待同一个事件的时候(休眠状态),如果等待的这个事件发生,那么它就会唤醒等待的所有进程(或者线程),但是最终却只能有一个进程(线程)获得这个时间的“控制权”,对该事件进行处理,而其他进程(线程)获取“控制权”失败,只能重新进入休眠状态,这种现象和性能浪费就叫做惊群效应。 >FCGI_LOCK和FCGI_UNLOCK在Linux下已经没有实现了,Linux2.6内核上,阻塞版的accept系统调用已经不存在“惊群”了。大概的处理方式就是,当内核接收到一个客户连接后,**只会唤醒等待队列上的第一个进程或线程**。 3)进入php_execute_script,对脚本执行编译。 4)调用php_request_shutdown关闭请求,继续进入循环。 5)如果进程退出,调用php_module_shutdown关闭所有模块。 6)如果请求次数大于max_requests,则跳转5。