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

浏览器(客户端): 负责通过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调用链.

nginx到php-fpm到php框架的数据传递过程相关推荐

  1. Netty,Nginx严重落后;网络IO框架最新性能排名

    Netty,Nginx严重落后:网络IO框架最新性能排名 新一代网络IO框架性能吊打传统框架 最近看了一下最新第21期(2022年7月)的Techempower的网络框架性能排名,实在有些惊讶.很多老 ...

  2. 调度框架学习笔记(3)—— 集群调度框架的架构演进过程

    本章是 The evolution of cluster scheduler architectures 文章的学习笔记.这篇文章讨论了这些年调度架构是如何发展的以及为什么会这样发展. 首先介绍一下这 ...

  3. LayUi前端框架删除数据缓存问题(解决删除后刷新页面内容又会显示问题)

    LayUi前端框架删除数据缓存问题(解决删除后刷新页面内容又会显示问题) 参考文章: (1)LayUi前端框架删除数据缓存问题(解决删除后刷新页面内容又会显示问题) (2)https://www.cn ...

  4. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动过程 | 静态代理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  5. MVC之实体框架(数据持久化框架)EntityFrameWork(EF)

    EF - EntityFrameWork 中文名:实体框架(数据持久化框架) 1.使用EF查询(Linq to EF) 1.1使用标准查询运算符来查询 OumindBlogEntities db = ...

  6. html间数据传送,Express框架与html之间如何进行数据传递(示例代码)

    关于Node.js 的Express框架介绍,推荐看菜鸟教程的Express框架,很适合入门,这里不再赘述,这里主要讲一下Express框架与html之间如何进行数据传递 我采用的是JQuery的Aj ...

  7. 智慧北京02_初步ui框架_ 主界面_viewPager事件_xUtils_slidingMenu_网络缓存_数据传递...

    智慧北京02_初步ui框架_ 主界面_viewPager事件_xUtils_slidingMenu_网络缓存_数据传递 1.使用Fragment搭建ui框架 参考分析图 1.1,Fragment生命周 ...

  8. 深度学习框架zf_谈谈深度学习框架的数据排布

    最近同事碰到了一个不同框架模型互相转换的问题:pytorch模型或caffe模型要转到tensorflow和TFLite上进行移动端的部署.模型从pytorch或caffe转tensorflow通过O ...

  9. web元件库、axure元件库、通用元件库、常用web组件、常用表单、框架、数据表单、导航栏、边框、图标、列表、日期时间选择器、评分组件、穿梭框、输入框、步骤条、图表组件、数据可视化、后台模板、时间轴

    web元件库.axure元件库.通用元件库.常用web组件.常用表单.框架.数据表单.导航栏.边框.图标.列表.日期时间选择器.评分组件.穿梭框.输入框.步骤条.图表组件.数据可视化.后台模板.时间轴 ...

最新文章

  1. 返回的到的数据做整合_成功的整合营销有哪些秘诀
  2. Shell输入输出重定向:Shell Here Document,/dev/null文件
  3. 消除电脑的四大噪音源
  4. 面向对象编程思想-观察者模式
  5. 关键字restrict简介
  6. C语言:四则计算器(支持小数,括号和次方幂 组合输入计算)
  7. 【Mybatis】foreach标签在mybatis中的使用
  8. 都是成年人了,别再相信OA价格越低越好这种话了
  9. lua怎么嵌入php,Linux下安装PHP的lua扩展库
  10. 火遍日本 IT 界的「鱼书」终出续作,原来进阶深度学习竟然那么简单(文末赠书)...
  11. Oracle PL/SQL 程序设计读书笔记 - 第13章 其他数据类型
  12. Python的动态特性(类实例增加属性,动态变量类型)
  13. ps3 自制系统的C 语言,老树发新芽:PS3自制系统的使用与研究
  14. unity粒子系统笔记
  15. 计算机三种桌面图标,例举win7电脑桌面图标排列方式
  16. 有一种伪仪式感,叫“中国式旅行”
  17. 安全模式下密码忘记的解决方法
  18. Framer Motion问题收集
  19. 【Unity】窗口失去焦点后继续游戏处理
  20. c语言里输入12MmAA后回车,Word怎么用语言输入

热门文章

  1. JAVA Map 的复制
  2. 服务器显示尚未报告,wsus客户端尚未报告状态.doc
  3. PKUWC2019 赛前模拟赛总结
  4. 游戏麦克风推荐— HyperX声浪加强版游戏麦克风声控+颜值党的幸运
  5. 铁威马NAS教程之利用docker快速搭建个人在线书库
  6. java基础实现简单的资源下载小工具
  7. CCF NOI1055. 走廊 (C++)
  8. 计算机网络基础之多路复用技术
  9. 得到影视源码分享(有演示),带一键采集,亲测能用,适合懒人做电影站!
  10. html如何做旅游网页,HTML+CSS旅游网站