PHP-FPM是多进程的FastCGI管理程序
FastCGI 协议
Nginx 通过 FastCGI 协议将请求转发给 PHP-FPM 处理
协程是一种轻量级的线程
一个进程内同一时间只会有一个协程在运行且切换时机明确
http请求过程
1. 解析URL
浏览器会解析当前的URL数据,判断此URL是否为合法的链接。如果是合法链接则正常的向下一步骤前进。如果不是合法的链接,则会执行搜索功能,例如执行百度、360、Google搜索等。
2. 域名解析
服务器是以ip的形式存在的。而域名需要解析到ip上,解析IP会有三个小的步骤:
1、从浏览器自身的缓存中解析此域名数据
2、从本地电脑的HOST文件中解析域名
3、通过DNS服务器解析域名
3. 拿信息
这个步骤我们拿到了URL的信息,主要是IP和端口信息。
4.封包并进行三次握手
浏览器将请求信息进行打包,通过TCP的三次握手将数据传递至服务器。
HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn(同步序列编号)包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手.
完成三次握手,客户端与服务器开始传送数据
5. 服务器解析、处理、返回数据
服务器通过种种层级、方式拿到传递的数据,对数据进行分析、处理,最后返回响应类MIME类型数据。正常状态码为200,非正常的错误码有404、500、501等等
PHP开发Web应用时所有的请求需要指向具体的入口文件。
WebServer监听端口传输数据
WebServer(web服务器)是一个内容分发者,他接受用户的请求后,
如果请求的是css、js等静态文件,WebServer会找到这个文件,然后发送给浏览器;
如果请求的是.php,根据配置文件,去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。
WebServer会依据CGI协议,将请求的Url、数据、Http Header等信息发送给PHP解析器,接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。
FastCGI协议
这里的PHP解析器就是实现了CGI协议的程序,每次请求到来时他会解析php.ini文件,初始化执行环境,这就导致PHP解析器性能低下,于是就出现了CGI的改良升级版FastCGI。
FastCGI是一种语言无关的协议,用来沟通程序(如PHP, Python, Java)和Web服务器(Apache2, Nginx), 理论上任何语言编写的程序都可以通过FastCGI来提供Web服务。
它的特点是会在动态分配处理进程给请求,以达到提高效率的目的,大多数FastCGI实现都会维护一个进程池。
FastCGI会先启一个master进程,解析配置文件,初始化执行环境(这里是一次),然后再启动多个worker进程。当请求过来时,master进程会把这个请求传递给一个worker进程,然后立即接受下一个请求。而且当worker进程不够用时,master可以根据配置预先启动几个worker进程等待;当然空闲worker进程太多时,也会自动关闭,这样就提高了性能,节约了系统资源。整个过程FastCGI扮演着对CGI进程进行管理的角色。
但是worker进程数量有限,是阻塞执行。有多少worker进程就处理多少个请求。
PHP-FPM程序
PHP-FPM是一个专门针对PHP实现了FastCGI协议的程序,它实际上就是一个PHP FastCGI进程管理器,负责管理一个进程池,调用PHP解析器来处理来自Web服务器的请求。PHP-FPM能够对php.ini文件的修改进行平滑过度。
6. 浏览器获得、渲染、展现数据
浏览器从服务器拿到数据、通过加载资源、渲染页面等操作,将页面展现给用户。