php nginx 执行过程,PHP+Nginx执行请求的原理

摘要当我们访问一个 Web 站点,PHP 和 Nginx 是怎么去执行的呢?

浏览器发起请求 -> web_server(nginx) 分发处理-> PHP 执行代码返回结果

CGICGI

CGI 是 Web 服务器运行外部程序的规范。意思就是通过 CGI 可以与你的程序通信,通过 CGI 标准格式。你的程序可以和浏览器交互。简单理解 CGI 就是一个协议,规定了一些东西该怎么传,你的程序这边怎么接受处理等规范。

PHP-CGI

PHP-CGI 就是 CGI 协议 PHP 的一个实现版。PHP-CGI 会为每个请求 fork 一个进程处理,处理完成后退出。(这个模式叫做 fork-and-execute)。这样的模式不符合现在动不动大规模的流量,所以已退出历史舞台。

FastCGI

FastCGI 是 CGI 的升级版,他会预先启动一个 master 进程读取配置文件,然后 fork 多个 work 进程等待连接。监听到请求,分配给 work 进程做具体的处理。这样大大提高了程序的性能。FastCGi 会管理进程,处理完成后不会轻易销毁。而 CGI 会为每一个请求,创建进程,销毁进程。

PHPFPM

作为世界上最好的语言,当然要跟上潮流。当发现 PHP-CGI 性能不佳时,又恰好出现了 FastCGI 协议。所以 PHP 实现了一个 PHP 版本的 FastCGI,名字叫做 PHPFPM(FastCGI Process Manager)。 PHPFPM 启动时会开启 一个 master 进程和若干个 work 进程。master 进程监听请求,并转发给 work 进程处理,每一个 work 进程都有一个 PHP 解释器,你的代码在每一个 work 进程中都有一份,work 进程是真正执行代码的地方。

一次完整的流程

首先用户访问 Web 站点

域名进行 DNS 解析

DNS 解析完成之后,发起 TCP 协议的三次捂手

HTTP 请求对应 IP 服务器和端口

Nginx 监听到对应的端口请求之后

Nginx 会对 URL 做一个 Location 的正则匹配

如果是静态资源则返回文件,Nginx 响应 HTTP 请求

如果是动态资源,通过正则匹配到请求 PHP 脚本,那么他会通过 Nginx 的模块 ngx_http_fastcgi_module 把请求分发给 PHPFPM 处理,也就是 Nginx 配置文件当中的 fastcgi_pass=127.0.0.1:9000 这种属于网络模式

PHPFPM master 进程监听到请求之后,分配给 work 处理(每一个 work 进程中都有一个 PHP 解释器),PHPFPM 在启动的时候已经 work 进程已经加载了配置,加载了你写的代码。所以说 work 进程接收到请求后立马执行,然后 work 进程执行返回的结果给 Nginx,Nginx 响应 HTTP 请求。

ngx_http_fastcgi_module 模块

在浏览器请求 web_server 是 HTTP 协议 或者 HTTPS 协议,但是 PHPFPM 不懂怎么办了?这里 Nginx 提供了一个 ngx_http_fastcgi_module ,ngx_http_fastcgi_module 把 HTTP 或者 HTTPS 请求 映射成 FastCGI 请求。这样 PHP 程序就能和用户互动了。

PHP 平滑重启原理

每次修改完 PHP.ini 配置并重启后,会启动新的 worker 进程加载新的配置,而之前已经存在的进程会在工作完成之后销毁,因此实现平滑重启

进程与线程

进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。

线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。一个程序至少一个进程,一个进程至少一个线程。

进程线程的区别:地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。

资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。

一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程执行过程:每个独立的进程程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

线程是处理器调度的基本单位,但是进程不是。

两者均可并发执行。

优缺点:

线程执行开销小,但是不利于资源的管理和保护。线程适合在SMP机器(双CPU系统)上运行。

进程执行开销大,但是能够很好的进行资源管理和保护。进程可以跨机器前移。

何时使用多进程,何时使用多线程?

对资源的管理和保护要求高,不限制开销和效率时,使用多进程。

要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值