最早接触到PHP是在去年想做个人网站的时候,那时候也接触并搭建了WordPress主题,Discuz论坛,织梦等内容管理系统(CMS,Content Management System)。而这些框架或者产品都是用PHP做的,从而可以看出PHP在特定领域内还是发挥了大的作用并得到追随。
“世界上最好的语言”也被作为一个梗在程序员圈子里传播。对于开发人员来说,语言相比业务而言是次要的(当然,如果你不想做开发,而是想当计算机科学家或者研究编程语言,那这句话就不适合你)。业务在很大程度上左右了你工作中的开发语言,说起PHP,很多人会搬来Java这位业界老大,如果非要站在JAVA这边并用欣赏的眼光来看PHP,PHP相比Java的很显著优势之一就是快,不是性能的快,而是上手的快,开发的快,上线的快。跟前端的适当耦合,语法的相对简易(相比而言的,也没那么简单,毕竟也是一门优秀的编程语言),都使得学习和开发的成本相比而言低了那么一些,对于许多商业的中小型项目来说,这个特点可是很诱人的。
而对于任何一门编程语言,都有必要理解它的设计原理和组成架构,在宏观上对它进行把握,才有真正掌握甚至精通这门语言的可能。接下来我们开始进入主题。先看下PHP的一个结构图:
![f1fd5a59cfd03c8cc1b8a4f1cc059a73.png](https://i-blog.csdnimg.cn/blog_migrate/6dd29f24467492ae56769799aad5230a.png)
我们可以看到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的执行过程:
![d8d5774d6664a2dc3e3439b2769954a1.png](https://i-blog.csdnimg.cn/blog_migrate/452b142b4e99bf25272c73717ad668ea.jpeg)
可以看出,PHP脚本执行之前都会去共享内存中看是否有OpCode的缓存,如果有就直接加载然后被Zend引擎直接执行,否则就需要先对脚本解析和编译并且将编译出的OpCode存入共享内存,方便下次调用。
OpCode被执行后会被SAPI进行处理,然后和前端页面整合压缩后再由服务器(通常为Apache或者Nginx)发送给浏览器显示在前端页面。这就是PHP脚本执行的过程。
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我整理了一些资料,需要的可以免费分享给大家(点击此处加入php高级交流群一起学习交流。)
如果喜欢我的文章,想与一群资深开发者一起交流学习的话,获取更多相关大厂面试咨询和指导,欢迎加入我的学习交流群856460874一起学习成长