PHP底层运行机制与工作原理详解


Posted in PHP onJuly 31, 2020

最近搭建服务器,突然感觉lamp之间到底是怎么工作的,或者是怎么联系起来?平时只是写程序,重来没有思考过他们之间的工作原理:

PHP底层工作原理

PHP底层运行机制与工作原理详解

图1 php结构

从图上可以看出,php从下到上是一个4层体系

①Zend引擎

Zend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕zend实现。

②Extensions

围绕着zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的php中间层、富文本解析就是extension的典型应用)。

③Sapi

Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过sapi成功的将php本身和上层应用解耦隔离,php可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。后面将在sapi章节中介绍

④上层应用

这就是我们平时编写的php程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等。

构架思想:

引擎(Zend)+组件(ext)的模式降低内部耦合

中间层(sapi)隔绝web server和php

**************************************************************************

如果php是一辆车,那么
车的框架就是php本身
Zend是车的引擎(发动机)
Ext下面的各种组件就是车的轮子
Sapi可以看做是公路,车可以跑在不同类型的公路上
而一次php程序的执行就是汽车跑在公路上。
因此,我们需要:性能优异的引擎+合适的车轮+正确的跑道

Apache和php的关系

Apache对于php的解析,就是通过众多Module中的php Module来完成的。

PHP底层运行机制与工作原理详解

把php最终集成到Apache系统中,还需要对Apache进行一些必要的设置。这里,我们就以php的mod_php5 SAPI运行模式为例进行讲解,至于SAPI这个概念后面我们还会详细讲解。

假定我们安装的版本是Apache2 和 Php5,那么需要编辑Apache的主配置文件http.conf,在其中加入下面的几行内容:

Unix/Linux环境下:

LoadModule php5_module modules/mod_php5.so

AddType application/x-httpd-php .php

注:其中modules/mod_php5.so 是X系统环境下mod_php5.so文件的安装位置。

Windows环境下:

LoadModule php5_module d:/php/php5apache2.dll

AddType application/x-httpd-php .php

注:其中d:/php/php5apache2.dll 是在Windows环境下php5apache2.dll文件的安装位置。

这两项配置就是告诉Apache Server,以后收到的Url用户请求,凡是以php作为后缀,就需要调用php5_module模块(mod_php5.so/ php5apache2.dll)进行处理。

Apache的生命周期

PHP底层运行机制与工作原理详解

Apach的请求处理流程

PHP底层运行机制与工作原理详解

Apache请求处理循环详解

Apache请求处理循环的11个阶段都做了哪些事情呢?

1、Post-Read-Request阶段
在正常请求处理流程中,这是模块可以插入钩子的第一个阶段。对于那些想很早进入处理请求的模块来说,这个阶段可以被利用。

2、URI Translation阶段
Apache在本阶段的主要工作:将请求的URL映射到本地文件系统。模块可以在这阶段插入钩子,执行自己的映射逻辑。mod_alias就是利用这个阶段工作的。

3、Header Parsing阶段
Apache在本阶段的主要工作:检查请求的头部。由于模块可以在请求处理流程的任何一个点上执行检查请求头部的任务,因此这个钩子很少被使用。mod_setenvif就是利用这个阶段工作的。

4、Access Control阶段
Apache在本阶段的主要工作:根据配置文件检查是否允许访问请求的资源。Apache的标准逻辑实现了允许和拒绝指令。mod_authz_host就是利用这个阶段工作的。

5、Authentication阶段
Apache在本阶段的主要工作:按照配置文件设定的策略对用户进行认证,并设定用户名区域。模块可以在这阶段插入钩子,实现一个认证方法。

6、Authorization阶段
Apache在本阶段的主要工作:根据配置文件检查是否允许认证过的用户执行请求的操作。模块可以在这阶段插入钩子,实现一个用户权限管理的方法。

7、MIME Type Checking阶段
Apache在本阶段的主要工作:根据请求资源的MIME类型的相关规则,判定将要使用的内容处理函数。标准模块mod_negotiation和mod_mime实现了这个钩子。

8、FixUp阶段
这是一个通用的阶段,允许模块在内容生成器之前,运行任何必要的处理流程。和Post_Read_Request类似,这是一个能够捕获任何信息的钩子,也是最常使用的钩子。

9、Response阶段
Apache在本阶段的主要工作:生成返回客户端的内容,负责给客户端发送一个恰当的回复。这个阶段是整个处理流程的核心部分。

10、Logging阶段
Apache在本阶段的主要工作:在回复已经发送给客户端之后记录事务。模块可能修改或者替换Apache的标准日志记录。

11、CleanUp阶段
Apache在本阶段的主要工作:清理本次请求事务处理完成之后遗留的环境,比如文件、目录的处理或者Socket的关闭等等,这是Apache一次请求处理的最后一个阶段。

LAMP架构:

PHP底层运行机制与工作原理详解

从下往上四层:

①liunx 属于操作系统的底层

②apache服务器,属于次服务器,沟通linux和PHP

③php:属于服务端编程语言,通过php_module 模块 和apache关联

④mysql和其他web服务:属于应用服务,通过PHP的Extensions外 挂模块和mysql关联

Android系统架构图

lamp和安卓的架构图比较一下,貌似和lamp架构有点相似,本人不懂安卓,只是感觉上有点相似,高手可以指出区别,小弟在此不胜感谢

PHP底层运行机制与工作原理详解

从上往下:

安卓架构--------------说明--------LAMP架构

1.应用程序 --------具体应用--------web应用

2.应用程序框架 ----java-------------PHP语言和库

3.系统运行库 :----虚拟机---------WEB服务器

⒋Linux 内核 :---操作系统-------lamp架构中的L

lamp和电脑内部的关系

PHP底层运行机制与工作原理详解

CPU是工厂,硬盘是大仓库,内存是正规中转中心,虚拟内存是临时中转中心

Php语言由zend编译成机器语言,操作cpu

对数据库的操作属于I/O操作,属于机械运动,也就是说一个网站的瓶颈再去对硬盘的读写造成的,解决办法就是减少i/o操作次数,使用缓冲技术,就是在数据的操作放在mencache里面,达到一定数量级的时候在一次性写入数据库,mencache属于key--value关系

而非关系型数据也是基于这个理念建设的,也是属于key--value关系

频繁读操作------放在mencache里面

读多写少----放在nosql里面------读取功能很强大!

到此这篇关于PHP底层运行机制与工作原理的文章就介绍到这了,更多相关PHP底层运行机制与工作原理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
PHP新手上路(十四)
Oct 09 PHP
第十五节--Zend引擎的发展
Nov 16 PHP
PHP CURL模拟GET及POST函数代码
Apr 25 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
Nov 02 PHP
ThinkPHP采用模块和操作分析
Apr 18 PHP
PHP Switch 语句之学习笔记
Sep 21 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
Sep 10 PHP
php 魔术方法详解
Nov 11 PHP
PHP使用适合阅读的格式显示文件大小的方法
Mar 05 PHP
PHP结合jQuery实现找回密码
Jul 22 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
May 12 PHP
一个简单安全的PHP验证码类 附调用方法
Jun 24 PHP
如何通过Apache在本地配置多个虚拟主机
Jul 29 #PHP
PHP网页缓存技术优点及代码实例
Jul 29 #PHP
phpStudy vscode 搭建debug调试的教程详解
Jul 28 #PHP
jQuery+PHP实现图片上传并提交功能
Jul 27 #PHP
关于PHP中interface的用处详解
Jul 26 #PHP
Laravel中如何轻松容易的输出完整的SQL语句
Jul 26 #PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
Jul 24 #PHP
You might like
GD输出汉字的函数的分析
2006/10/09 PHP
PHP中GET变量的使用
2006/10/09 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
php中让人头疼的浮点数运算分析
2016/10/10 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
学习JavaScript设计模式之单例模式
2016/01/19 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
详解ECMAScript6入门--Class对象
2017/04/27 Javascript
JavaScript定义函数的三种实现方法
2017/09/23 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
使用vscode快速建立vue模板过程详解
2019/10/10 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
你不知道的SpringBoot与Vue部署解决方案
2020/11/09 Javascript
Python常用模块用法分析
2014/09/08 Python
初步解析Python中的yield函数的用法
2015/04/03 Python
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
深入浅析python 协程与go协程的区别
2019/05/09 Python
Python实现12306火车票抢票系统
2019/07/04 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
Python IDE环境之 新版Pycharm安装详细教程
2020/03/05 Python
python opencv实现图像配准与比较
2021/02/09 Python
如何用 Python 制作一个迷宫游戏
2021/02/25 Python
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
澳大利亚设计的优质鞋类和适合澳大利亚生活方式的服装:Rivers
2019/04/23 全球购物
Tessabit日本:集世界奢侈品和设计师品牌的意大利精品买手店
2020/01/07 全球购物
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
医务工作者先进事迹材料
2014/01/26 职场文书
党员岗位承诺书
2014/03/25 职场文书
四风对照检查材料思想汇报
2014/09/20 职场文书
2015年中秋寄语
2015/07/31 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript