PHP架构入门

最早接触到PHP是在去年想做个人网站的时候,那时候也接触并搭建了WordPress主题,Discuz论坛,织梦等内容管理系统(CMS,Content Management System)。而这些框架或者产品都是用PHP做的,从而可以看出PHP在特定领域内还是发挥了大的作用并得到追随。

“世界上最好的语言”也被作为一个梗在程序员圈子里传播。对于开发人员来说,语言相比业务而言是次要的(当然,如果你不想做开发,而是想当计算机科学家或者研究编程语言,那这句话就不适合你)。业务在很大程度上左右了你工作中的开发语言,说起PHP,很多人会搬来Java这位业界老大,如果非要站在JAVA这边并用欣赏的眼光来看PHP,PHP相比Java的很显著优势之一就是快,不是性能的快,而是上手的快,开发的快,上线的快。跟前端的适当耦合,语法的相对简易(相比而言的,也没那么简单,毕竟也是一门优秀的编程语言),都使得学习和开发的成本相比而言低了那么一些,对于许多商业的中小型项目来说,这个特点可是很诱人的。

而对于任何一门编程语言,都有必要理解它的设计原理和组成架构,在宏观上对它进行把握,才有真正掌握甚至精通这门语言的可能。接下来我们开始进入主题。先看下PHP的一个结构图:

我们可以看到PHP由大大小小的模块组成,很明显的解耦。我们具体看四个主要模块:

Zend 引擎

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

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

词法分析 Scanning,将 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 程序员主要工作就是编写它们。

下面是PHP的执行过程:

可以看出,PHP脚本执行之前都会去共享内存中看是否有OpCode的缓存,如果有就直接加载然后被Zend引擎直接执行,否则就需要先对脚本解析和编译并且将编译出的OpCode存入共享内存,方便下次调用。

OpCode被执行后会被SAPI进行处理,然后和前端页面整合压缩后再由服务器(通常为Apache或者Nginx)发送给浏览器显示在前端页面。这就是PHP脚本执行的过程。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180721G16E7U00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券