PHP动态请求的流程详解

一、用户在浏览器输入地址www.baidu.com, 需要先确定域名对应的服务器ip:

1、找本地的DNS缓存,如浏览器缓存、操作系统缓存、路由缓存;

2、找本地host;

3、找本地DNS服务器。就是我们在配置网络时候,填写的DNS服务器IP,比如8.8.8.8;

4、找远程DNS服务器。当本地DNS服务器没有域名和ip的映射关系,本地DNS服务器会向根域名服务器发起询问,但是.根服务器并没有域名和ip的映射关系,它会告诉你去问.com域服务器,.com服务器同样不会告诉你域名对应的ip地址,它会告诉你去问baidu.com服务器,最终baidu.com域服务器会告诉你www.baidu.com域名对应的ip。

 

二、客户端拿到ip,向webserver发起请求

1、第一次握手:client将标志位SYN置为1(SYN=1),并随机生成一个同步序列号Seq=J,并将数据包(报文) 发送给server,等待server确认,此时client进入SYN_SENT状态;

2、第二次握手:server收到client发过来的SYN数据包后,由标志位SYN=1知道客户端请求和自己建立连接,于是将标志位SYN和ACK置为1,ack=J+1,Seq=K,并将数据包发送给clinet,此时server端进入SYN_RCVD;

3、第三次握手:client收到来自server的确认报文后,检查是否ack=J+1,是否ACK=1,检查正确后将ACK=1,ack=K+1,并将数据包发送给server端,server收到数据包后检查是否ack=K+1,ACK=1,确认无误后连接建立,此时client和server均进入ESTABLISHED状态,至此client和server端就可以传输数据了。这里的server就是webserver,比如nginx。

 

三、webserver和php等动态脚本的交互流程。

早期webserver主要是作为html等静态资源服务器,

后来出现了php等各类动态语言,webserver处理不了,需要交给php解释器来处理,但是php解释器如何和webserver通信呢,于是cgi协议就应用而生了,但是cgi协议有个很大的缺陷,server每接到一个动态请求后,就会fork出一个cgi进程,请求结束后还要kill掉这个进程,这样如果同时进来10000个请求,就需要重复10000次这样的fork和kill进程的操作,非常耗费资源和性能。

在这种情况下fastCgi就诞生了,它的优势就在于,每处理完一个请求,不会kill掉进程,而是保留进程去处理更多的请求,实现复用。fastCgi有一个master进程和多个worker进程( 具体多少个进程需要看php-fpm服务的配置文件php-fpm.conf),master进程负责循环监听来自客户端的动态请求,并分发请求给各个worker进程,每个worker进程都嵌入了php解释器,是php代码整整执行的地方。

补充: (在nginx配置文件中经常看到location ~ \.php {fastcgi_pass 127.0.0.1:9000;...}的配置,就是nginx在将php的动态请求抛给php-fpm的master进程来处理,master进程会继续将请求分发给worker进程,而worker进程内嵌有php解释器,最终由php解释器处理完以后,再将处理结果返回给nginx服务器,nginx服务器再将后端处理的内容,响应给浏览器等客户端处理)

 

四、有建立连接就会有断开连接,再说下TCP/IP协议四次挥手的流程。

第一次: Client向Server端发送FIN报文,关闭client到server的数据传送,client进入FIN_WAIT_1状态;

第二次: Server收到来自Client的FIN报文,发送ACK给client,确认序号为收到序号+1,Server进入CLOSE_WAIT状态;

第三次: Server向Client发送FIN报文, 关闭Server到Client的数据传送,进入LAST_ACK状态;

第四次:Client收到Fin报文后,client进入TIME_WAIT状态,随后发送ACK给Server,确认序号为收到序号+1,随后Client和server端均变为CLOSED状态,连接至此完全断开,完成四次挥手

 

你可能感兴趣的:(php)