PHP架构及原理知识点详解


Posted in PHP onDecember 22, 2019

记得我刚开始学习PHP的时候,许多面试官会经常问我PHP是什么,那时的标准回答是PHP是一种弱类型动态脚本编程语言,开源,

免费,是超文本预处理器的缩写。

这只是很浅的解释,PHP对我来说是一个工具,是我手里的一把锤子,虽然这把锤子时常被调侃为两边都是起钉器的锤子。

多进程模型

PHP是以多进程模型设计的,这样的好处是请求之间互不干涉,一个请求失败也不会对其他进程造成影响,作为最开始仅仅用于个人网站的一个工具集这样的设计并没有什么不妥,随着PHP的应用变大,访问量增加这种方式显然是不合适的,因为启动一个进程的开销对于海量请求是不划算的,所以现在PHP基本都是运行在PHP-FPM的管理下的,这是一个PHP进程管理器,它常驻内存启动一些PHP进程待命,当请求进入时分配一个进程进行处理,PHP进程处理完毕后回收进程,但并不销毁进程,这让PHP也能应对高流量的访问请求。

当然现在也有PHP多线程的解决方案和基于协程的解决方案让PHP更高效的处理WEB请求。

弱类型

与 JAVA、C/C++ 不同,PHP是一门若类型的语言,变量在声明的那一刻是不需要确定它的类型的,而在运行时类型也会发生显式或隐式的类型改变,这也是PHP开发应用迅速、方便的原因之一。

其他

Zend 引擎 + Ext 扩展 的模式降低了内部耦合,可以方便的为PHP本身增加功能和去除功能。

语法简单,没有太多强制规范,编程风格上既可以用过程式、也可以用面向对象的方式进行开发,当然函数式也可以。

以目前的 PHP 主流版本 PHP7 和 PHP5 来说架构是如上图所示,主要有四层体系构成,从下到上依次是 Zend 引擎、Extensions 扩展、SAPI 接口、上层应用。

Zend 引擎

Zend 引擎是 PHP4 以后加入 PHP 的,是对原有PHP解释器的重写,整体使用 C 语言进行开发,也就是说可以把PHP理解成用C写的一个编程语言软件,引擎的作用是将PHP代码翻译为一种叫opcode的中间语言,它类似于JAVA的ByteCode(字节码)。

引擎对PHP代码会执行四个步骤:

词法分析 Scanning(Lexing),将 PHP 代码转换为语言片段(Tokens)。解析 Parsing, 将 Tokens 转换成简单而有意义的表达式。编译 Compilation,将表达式编译成Opcode。执行 Execution,顺序执行Opcode,每次一条,以实现PHP代码所表达的功能。

APC、Opchche 这些扩展可以将Opcode缓存以加速PHP应用的运行速度,使用它们就可以在请求再次来临时省略前三步。

引擎也实现了基本的数据结构、内存分配及管理,提供了相应的API方法供外部调用。

Extensions 扩展

常见的内置函数、标准库都是通过extension来实现的,这些叫做PHP的核心扩展,用户也可以根据自己的要求安装PHP的扩展。

SAPI

SAPI 是 Server Application Programming Interface 的缩写,中文为服务端应用编程接口,它通过一系列钩子函数使得PHP可以和外围交换数据,SAPI 就是 PHP 和外部环境的代理器,它把外部环境抽象后,为内部的PHP提供一套固定的,统一的接口,使得 PHP 自身实现能够不受错综复杂的外部环境影响,保持一定的独立性。

通过 SAPI 的解耦,PHP 可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。

上层应用

程序员编写的PHP程序,无论是 Web 应用还是 Cli 方式运行的应用都是上层应用,PHP 程序员主要工作就是编写它们。

总结

这些东西如果你学习过 android 开发理解起来显然更容易,因为android的架构和PHP的这种架构看起来很相似。当你理解这些后你就会理解为什么PHP的创始人会说PHP开发其实是不需要框架的,因为PHP的设计本身就是一个类似框架的东西,如果用汽车比喻的话PHP本身就是就是车的骨架,Zend的是引擎,Ext是轮子,方向盘等车的组件,SAPI 就是路。

对于这些内容,可能有的人觉得有点无用,因为很多人偏执的认为自己只是个开车的,为什么开车的要了解车子是怎么跑起来的,对于了解如何制造一辆车更是嗤之以鼻。我曾经也这样认为,直到翻译Laravel文档时,Laravel 的作者给了我一些启发,也把这些话送给看到这个文章的你们:

使用「现实世界」中的任何工具时,如果理解这个工具的运作原理,那么你会更加得心应手的使用这个工具。应用开发也是这样。当你明白你的开发工具如何运行的,你就会对它们的使用游刃有余。

这篇文档的目的是让你更好的理解 Laravel 框架如何进行工作及它的工作原理。通过对框架进行全面的了解,一切都不会那么「神奇」,也将会让你更有自信的构建你的应用。

以上就是PHP是什么-PHP的架构及原理概述的详细内容,感谢大家的学习和对三水点靠木的支持。

PHP 相关文章推荐
php数组函数序列之array_unique() - 去除数组中重复的元素值
Oct 29 PHP
解析PHP正则提取或替换img标记属性
Jun 26 PHP
php导入导出excel实例
Oct 25 PHP
php定义数组和使用示例(php数组的定义方法)
Mar 29 PHP
推荐5款跨平台的PHP编辑器
Dec 25 PHP
PHP图像处理类库及演示分享
May 17 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
Mar 05 PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
Jun 11 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
Aug 11 PHP
Laravel如何自定义command命令浅析
Mar 23 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
Apr 15 PHP
laravel框架模型和数据库基础操作实例详解
Jan 25 PHP
Laravel 验证码认证学习记录小结
Dec 20 #PHP
php文件上传原理与实现方法详解
Dec 20 #PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 #PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 #PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 #PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 #PHP
Laravel框架处理用户的请求操作详解
Dec 20 #PHP
You might like
php下图片文字混合水印与缩略图实现代码
2009/12/11 PHP
来自phpguru得Php Cache类源码
2010/04/15 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
php强制运行广告的方法
2014/12/01 PHP
JavaScript 放大镜 放大倍率和视窗尺寸
2011/05/09 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
JS HTML5 音乐天气播放器(Ajax获取天气信息)
2013/05/26 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
2018/10/22 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
2019/08/27 Javascript
Vue 3.0双向绑定原理的实现方法
2019/10/23 Javascript
vue遍历生成的输入框 绑定及修改值示例
2019/10/30 Javascript
环形加载进度条封装(Vue插件版和原生js版)
2019/12/04 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
2020/03/03 Javascript
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
2018/05/29 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
python框架flask入门之路由及简单实现方法
2020/06/07 Python
Django serializer优化类视图的实现示例
2020/07/16 Python
澳大利亚家庭花园和DIY工具网店:VidaXL
2019/05/03 全球购物
优秀的茶餐厅创业计划书
2014/01/03 职场文书
浙江文明网签名寄语
2014/01/18 职场文书
业绩考核岗位职责
2014/02/01 职场文书
春节联欢会策划方案
2014/05/16 职场文书
诉讼财产保全担保书
2014/05/20 职场文书
学习教师敬业奉献模范事迹材料思想汇报
2014/09/19 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书