访问一个PHP Web的执行流程
哎、带着沉重的心情写下这篇文章,别问为什么,问就是不知道
今天浅谈一下 当一个用户在浏览器输入 www.tebie6.com 会经历哪些流程步骤
首先先普及几个知识点
Nginx是什么?
Nginx 是一个高性能HTTP和反向代理服务器,Web Server
php-fpm是什么
首先我们要知道,cgi和fast-cgi协议
CGI 的英文全名是 Common Gateway Interface,即通用网关接口
早期的Web Server 只处理静态文件的访问,随着技术的发展出现了 PHP这类的动态脚本语言
这时候Web Server 已经处理不了了,只能交给动态语言解释器(php解释器)
为了解决 Web Server 和 不同的动态语言解释器通信,于是出现了cgi 协议
只要按照cgi协议去编写程序就能实现 Web Server 和 语言解释器的通信
cgi工作流程
有了cgi 协议 Web Server 和 语言解释器就能通信,web server就能处理动态语言了
但是web server 每收到一个请求都会fork 一个cgi进程,请求结束后在kill掉进程,访问1w次请求 就会fork、kill 1w次进程
非常影响效率,浪费资源
于是有了 cgi的改良版 fast-cgi, fast-cgi 每次处理完请求后不会kill掉进程,等待下一个请求,相当于一个进程池,这样就大大节省了资源的开销,提高了效率
而 fast-cgi 则会先 fork 一个 master 进程,解析配置文件,初始化执行环境,然后再 fork 多个 worker 进程,当 HTTP 请求过来时,master 进程将其会传递给一个 worker 进程,然后立即可以接受下一个请求
php-fpm 介绍
php-fpm 即 php-Fastcgi Process Manager.
php-fpm 是一个实现了PHP版本的FastCGI协议的程序,并提供进程管理的功能
要知道PHP的解释器是 php-fastcgi,php-fastcgi只是个实现CGI协议的程序,他只能解析请求返回结果,不能对进程进行管理
所以出现了php-fpm 来对php-fastcgi进行调度管理
进程包含 master 进程和 worker 进程两种进程。
master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。
PHP-FPM 负责管理一个进程池来处理来自 Web 服务器的 HTTP 动态请求,在 PHP-FPM 中,master 进程负责与 Web 服务器进行通信,接收 HTTP 请求,再将请求转发给 worker 进程进行处理,worker 进程主要负责动态执行 PHP 代码,处理完成后,将处理结果返回给 Web 服务器,再由 Web 服务器将结果发送给客户端。这就是 PHP-FPM 的基本工作原理,
参考图:(网上找的)
访问流程
知道了上面的知识我们来说一下主要内容
流程图:
www.tebie6.com | |
浏览器先尝试获取本机的hosts文件来获取ip地址,如果找不到就会像本地DNS服务器请求(一般是路由器),如果获取不到ip就去更高一层的DNS服务器获取
|
|
TCP建立连接(三次握手)发送报文
|
|
Nginx 通过端口监听获取到请求 | | 路由到www.tebie6.com/index.php | | 加载nginx的fast-cgi模块 | | fast-cgi监听127.0.0.1:9000地址 | | www.tebie6.com/index.php请求到达127.0.0.1:9000 | | php-fpm 监听127.0.0.1:9000 | | php-fpm 接收到请求,启用worker进程处理请求 | | php-fpm 处理完请求,返回给nginx | | nginx将结果通过http返回给浏览
以上就是访问一个PHP Web的执行过程
知识点扩展 Nginx 和 php的通信方式有哪些?
TCP 和 Sokcet
9000端口属于TCP请求
具体内容参考:https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/83032578