PHP是什么? PHP的架构及原理概述

日记随笔 2019年11月14日 阅读 102 我也庸俗
记得我刚开始学习PHP的时候,许多面试官会经常问我PHP是什么,那时的标准回答是PHP是一种弱类型动态脚本编程语言,开源,免费,是超文本预处理器的缩写。
这只是很浅的解释,PHP对我来说是一个工具,是我手里的一把锤子,虽然这把锤子时常被调侃为两边都是起钉器的锤子。
PHP 的特点

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

Zend 引擎

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

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

  1. 词法分析 Scanning(Lexing),将 PHP 代码转换为语言片段(Tokens)。
  2. 解析 Parsing, 将 Tokens 转换成简单而有意义的表达式。
  3. 编译 Compilation,将表达式编译成Opcode。
  4. 执行 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 框架如何进行工作及它的工作原理。通过对框架进行全面的了解,一切都不会那么「神奇」,也将会让你更有自信的构建你的应用。

我也庸俗 我也庸俗 开发工程师@有赞科技公司

写了 159279 字,被 1 人关注,共写了 71 篇笔记

孤独了忙碌的人
推荐文章:
  • 解决此图片来自微信公众平台未经允许不可引用问题,第三方网站无法引用微信图片

    项目中需要一个产品详情,所以一般都是在微信公众号哪里排版之后,然后复制到自己的项目里发布,刚开始复制粘贴,没有想到图片居然没法引用显示这个样子:后来发现解决的一种方式就是通过给header头添加一段代...

    1个月前 0 吐槽 99 围观 日记随笔
  • 微信访问网页出现 更改代码但是网页没变化

    一开始看的时候一直以为是自己代码操作问题,后来查看了一下,发现是微信内置浏览器有一个web-view上储存缓存,就是如果请求过了这个地址,就会存在本地,之后不取线上了,确实把哥们苦恼坏了,所以开始解决...

    2个月前 0 吐槽 99 围观 日记随笔
  • cetons 8 重启网卡

    nmcli c reload 其他的版本可能用 service network restart 如果是 Kali Linux(Debian)的话 就用 service networking rest...

    2个月前 0 吐槽 100 围观 日记随笔
  • Linux 自学第一天

    从今天开始从基础学Linux 加油!!!

    3个月前 0 吐槽 78 围观 日记随笔
  • 其实我并不知道我想写一些什么!

    昨天是六一儿童节,对于我们这些老年人那就是普通的一天。但是我也在思考,我们所谓的人生观,价值观,是不是已经产生了质变。我们要成家,我们要买房,我们要买车,这些所有的一切已经深深的烙印在我的心头。因为知...

    豆浆大叔 8个月前 0 吐槽 178 围观 日记随笔
表情
  • [:821l1001:]
  • [:821l1002:]
  • [:821l1003:]
  • [:821l1004:]
  • [:821l1005:]
  • [:821l1006:]
  • [:821l1007:]
  • [:821l1008:]
  • [:821l1009:]
  • [:821l1010:]
  • [:821l1011:]
  • [:821l1012:]
  • [:821l1013:]
  • [:821l1014:]
  • [:821l1015:]
  • [:821l1016:]
  • [:821l1017:]
  • [:821l1018:]
  • [:821l1019:]
  • [:821l1020:]
  • [:821l1021:]
  • [:821l1022:]
  • [:821l1023:]
  • [:821l1024:]
  • [:821l1025:]
  • [:821l1026:]
  • [:821l1027:]
  • [:821l1028:]
  • [:821l1029:]
  • [:821l1030:]
  • [:821l1031:]
  • [:821l1032:]
  • [:821l1033:]
  • [:821l1034:]
  • [:821l1035:]
  • [:821l1036:]
  • [:821l1037:]
  • [:821l1038:]
  • [:821l1039:]
  • [:821l1040:]
  • [:821l1041:]
  • [:821l1042:]
  • [:821l1043:]
  • [:821l1044:]
  • [:821l1045:]
  • [:821l1046:]
  • [:821l1047:]
  • [:821l1048:]
  • [:821l1049:]
  • [:anger:]
  • [:applause:]
  • [:awkward:]
  • [:brokenheart:]
  • [:clown:]
  • [:confused:]
  • [:decline:]
  • [:diggingmouth:]
  • [:eyebrows:]
  • [:grinning:]
  • [:haha:]
  • [:ill:]
  • [:kiss:]
  • [:lascivious:]
  • [:laugh:]
  • [:love:]
  • [:lovely:]
  • [:rhinorrhea:]
  • [:smile:]
  • [:solid:]
  • [:strong:]
  • [:sweat:]
  • [:tearcollapse:]
  • [:tongue:]
  • [:uncomfortable:]
  • [:weak:]
  • [:worry:]
Tips:支持Markdown语法

0 个评论

抢座沙发~~~~
开发工程师 @ 有赞科技公司

登录

第三方账号登录:
GitHub
微信
微博