IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> nginx到php-fpm到php框架的数据传递过程 -> 正文阅读

[PHP知识库]nginx到php-fpm到php框架的数据传递过程

在浏览器点击一个按钮, 发起一个请求, 最终服务器经过一系列复杂的计算之后, 响应给客户端数据. 现在用通俗的方式解释一下这个过程.
完成整个过程主要由以下几个角色各司其职

浏览器(客户端): 负责通过http协议与服务器对话, 方式是发送-接收http数据包

这里要理解的一点是, 对于浏览器而言, 他要做的工作就是按照网址, 从对应的服务器上获取对应文件中的内容. 这一点是不会变的.

web服务器(服务端): 负责接收http请求, 按照请求返回对应文件的内容

要什么文件就给什么文件, 找不到文件或者找到的文件不让看就报4xx系列错误, 找到文件但是发生故障了没法返回文件内容, 就报5xx系列错误

CGI协议(服务器中的普通话): 负责统一cgi程序的数据格式,让 web服务器CGI程序都能看得懂

CGI程序(Common Gateway Interface) : 会说普通话的程序都叫CGI程序, 就是说, 只要打印的字符串是按照CGI协议来的, 这个程序就是CGI程序.
服务器中运行着PHP, Perl, Python, java, C++, C等等各种语言, 无论哪种语言, 肯定都是可以向标准输出stdio打印字符串的, 比如 helloworld. 各种程序如果想把信息通过网络传输给客户端, 那就必须要按照CGI标准来打印.

PHP-CGI(php的翻译官): 负责解析PHP代码, 最终按照CGI协议输出运算结果

PHP5.4 RC2 版本以前, PHP内置的解释器就是php-cgi. 我们写PHP的时候知道, 如果要执行一个PHP脚本, 要调用PHP解释器来执行, 如 php test.php, 然后test.php中的代码就会被逐条解释执行. 网络请求来了之后, 就是由php-cgi执行的 php test.php这个过程.
在 PHP5.4 RC2 版本以后, php-cgi的角色由 php-fpm替代

FastCGI(快速说普通话标准): 负责解决CGI性能问题

由于各类语言编写的CGI程序响应速度较慢, 所以就有了这个标准. 注意fast-cgi并不是一个程序, 而是一种实现标准, 它只规定了凡是满足了这个标准的程序, 都被称作是FastCGI的一种实现. 常见的FastCGI程序有spawn-fcgi, FCGI Wrap, php-fpm, fcgi-cgi

PHP-FPM(php的高级翻译官): 负责解析PHP代码, 最终按照CGI协议输出运算结果

php-fpm 就是实现了FastCGI标准的一个软件
原本的php-fpm(FastCGI Process Manager)是负责管理cgi进程的程序, 当网络请求变多的时候, 每个cgi进程都会经历初始化PHP环境, 读取php.ini配置文件, 读取xx.php代码, 解释, 执行, 然后返回结果的过程. 这个过程性能很差, 网络拥堵严重. PHP-FPM经过多次实践改造后, 替代了php-cgi, 先加载好整个PHP环境, 创建好线程池, 请求一来就只做解释执行PHP代码的工作, 性能稳定,可靠.


名词解释完毕.
现在的PHP框架已经复杂到了看不懂的地步, 如Laravel, lumen, 每年更新一次, YII, ThinkPHP等等框架, 层层封装, 看上去和上面的请求过程似乎都联系不上. 实际上, 本质过程, 就是一个计算后打印字符串的过程, 只不过调用链随着时代发展越来越复杂, 越来越长. 大致步骤如下:

  1. 浏览器发起请求: http:xxx.com/a/b/c
  2. 服务器接收请求, 查找a目录下b目录下的c文件
  3. 服务器找不到c文件, 根据nginx中的tryfiles配置, 将/a/b/c这个uri转发给index.php, 由它处理, 交接过程如下.
    1). 服务器将所有请求信息传递给FastCGI程序, 此时服务器中运行的FastCGI程序是php-fpm, 请求就自然给了它.
    2). php-fpm拿到请求后, 开始从index.php开始解释执行.
    3).index.php开始加载框架
    4). 框架开始解析路由, 所有的服务器参数都要归功于CGI协议, 这些都是由nginx包装好传来的, 这样PHP中的$_SERVER中才有了一切想要的信息.
    5). 框架根据路由加载服务, 签名验证, 连接数据库, 执行Controller等等一系列复杂操作
    6). 最终, 整个PHP框架一定会echo 一个字符串出来
    7). 这个字符串再由php-fpm通过socket发送给nginx
  4. nginx终于在PHP这里找到了他想要找的文件, 文件内容就是这个echo出来的字符串. nginx认为这是一个文件的内容, 实际上是经过复杂计算动态生成的内容.

以上, 就是整个PHP调用链.

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 15:58:20  更:2022-04-06 15:58:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 20:27:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码