page contents

PHP在WEB端工作原理你知道吗?从底层源码到网络请求全过程解析

PHP创建动态交互性站点的强有力的服务器端脚本语言,作为WEB领域的首选开发语言,因其部署简单、语法简单、开发效率高而广受开发者的喜爱。全世界80%的网站都使用PHP来开发。 但正因为这样的方...

PHP创建动态交互性站点的强有力的服务器端脚本语言,作为WEB领域的首选开发语言,因其部署简单、语法简单、开发效率高而广受开发者的喜爱。全世界80%的网站都使用PHP来开发。

但正因为这样的方便简单,很多PHP工程师都停留在使用的阶段,而没有真正的去了解过PHP的工作原理,这无疑是让大家不能深入理解到PHP的执行工作原理,结果就会导致无法对项目后期做出合理的性能优化方案

我们不要做到: “知其然而不知其所以然”

项目运行环境的组成部分

运行环境是一个程序语言必须条件,它是执行基础设施。

例如:打篮球需要篮球场、唱歌需要麦克风。如果没得这些条件将不能完成工作事项

PHP的执行环境可按照操作系统来划分,分别是Windows、linux、Mac系统等。虽然系统名称不一样,但是系统上面需要使用的软件都是一样的。分别是Apache、nginx、mysql、php

注:操作系统都是基于Unix内核开发出来的。Unix是基于C开发的

Apache和nginx都是web服务器,用于接收用户从电脑、手机软件和网页发送的http请求,可以理解为仓库的入口。

mysql是关系型的数据库,用于存储整个网站的数据内容,例如:用户信息、商品信息等。可以理解为存储商品的仓库。

PHP就是执行PHP代码的解释器,用于完成这个http请求需要所做的工作内容。可以理解为在仓库作业的工作人员。

php是nginx和mysql的中间枢纽中心,接入用户请求指令,找到对应的数据。在返回给发送方。

正是因为这系统和软件的关系,就分别产生了Windows简称的wamp、wnmp和linux下面的lanp、lnmp。就是把软件名称取其首字母组合生成。

如何接入PHP请求

用户请求接入需nginx来做,它是项目的操作入口。当我们把请求发生到nginx之后。

拿出nginx的参数配置:

server {
listen 80; #监听80端口,接收http请求
server_name www.example.com; #一般存放网址,表示配置的哪个项目
root /home/wwwroot/public; # 存放代码的根目录地址或代码启动入口
index index.php index.html; #网站默认首页

#当请求网站的url进行location的前缀匹配且最长匹配字符串是该配置项时,按顺序检查文件是否存在,并返回第一个找到的文件
location / {
#try_files,按顺序检查文件是否存在,返回第一个找到的文件
#$uri代表不带请求参数的当前地址
#$query_string代表请求携带的参数
try_files $uri $uri/ /index.php?$query_string; #按顺序检查$uri文件,$uri地址是否存在,如果存在,返回第一个找到的文件;如果都不存在,发起访问/index.php?$query_string的内部请求,该请求会重新匹配到下面的location请求
}

#当请求网站的php文件的时候,反向代理到php-fpm去处理
location ~ \.php$ {
include fastcgi_params; #引入fastcgi的配置文件
fastcgi_pass 127.0.0.1:9000; #设置php fastcgi进程监听的IP地址和端口
fastcgi_index index.php; #设置首页文件
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #设置脚本文件请求的路径
}
}

nginx有如下步骤:

  1. nginx会根据过来的http请求头里的Host字段里的值,来判断使用哪个server{}。如果请求头里没有Host字段,或者Host字段里的值,和Nginx配置文件里的server{}里的{server_name}都不匹配,则使用第一个server{},来处理这个请求
  2. nginx 会首先测试 HTTP 请求的 IP 地址和 端口号是否与 server.listen 中的 IP:Port 一致,然后再测试 "Host" 请求头字段的值是否与 server.server_name 中的 name 一致。如果都没有一致,则选择 default_server 进行处理。
  3. nginx 首先查找最详细具体的 prefix location 记录,根据请求文件的来进行规则的匹配。

例如: toutiao.com /index.php 请求 匹配了 / 并且匹配 "\.php$",因此,根据 location 的配置,将该请求发送给 localhost:9000 的 FastCGI 服务器.

fastcgi_param 参数设置了 SCRIPT_FILENAME 值为 /home/wwwroot/public/index.php,由该 fastcgi server 执行该文件。其中:$document_root 为 root 指定的配置,$fastcgi_script_name 为请求 URI,如这里为 /index.php

最终根据规则的匹配把请求发生给PHP,然后再来解析PHP代码

PHP请求执行是谁来做?

nginx和php是2个软件,它们的之间的通信不在用普通的http协议来发送数据,因为nginx是web服务器,php是应用服务器,启动后由PHP-FPM来管理进程。nginx和php-fpm之间的传输协议采用fast-cgi,而不是默认的http协议。

fastcgi协议

fastcgi协议用来确定webserver(例如nginx),也就是内容分发服务器传递过来什么数据,什么样格式的数据

php-fpm进程管理器

php-fpm是对fastcgi协议的实现,是进程管理器,启动时包括master和worker进程俩部分,master进程监听端口,接收来自webserver请求,worker进程一般具有多个,每个worker进程都有一个cgi进程解释器,用来执行php代码

完整工作流程解析

用户发送请求会从解析域名开始,然后再发送服务器、执行响应结果。完成流程如下

用户输入域名访问网址 ---> 域名进行DNS解析 ---> 拿到对应IP服务器和端口 ---> nginx监听到对应端口的请求 ---> nginx对url进行location匹配 ---> 执行匹配location下的规则 ---> nginx转发请求给php的进程 ---> php-fpm的master进程监听到nginx请求 ---> master进程将请求分配给其中一个闲置的worker进程 ---> worker进程执行请求 ---> worker进程执行结果通过标准输出 stdout 返回给nginx ---> nginx通过HTTP 协议html返回给客户端 ---> 客户端在解析dom树,最终呈现页面

  • 发表于 2020-02-10 15:10
  • 阅读 ( 676 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章