什么是 PHP - PHP 架构和原理概述
在学习 PHP 时,很多面试官经常问我 PHP 是什么。当时的标准答案是PHP是一种弱类型动态脚本编程语言,开源,免费,是的超文本预处理器的缩写。
这只是一个非常肤浅的解释。 PHP对我来说是一个工具,是我手里的一把锤子,虽然这把锤子经常被嘲笑为两面带钉子的锤子。
PHP 的特点
多进程模型
PHP 是采用多进程模型设计的。优点是请求之间互不干扰,一个请求失败不会影响其他进程。作为起点 仅为个人网站设计工具集并没有什么问题。随着PHP应用程序变得越来越大,访问量越来越多,这种方法显然不适合,因为启动一个进程的成本对于海量请求来说并不划算。 ,所以现在PHP基本上运行在PHP-FPM的管理下,PHP-FPM是一个PHP进程管理器。它驻留在内存中并启动多个处于待机状态的 PHP 进程。当请求进来时,会分配一个进程来处理,由PHP进程来处理。该进程稍后被回收,但该进程并没有被销毁,使得PHP能够处理高流量的访问请求。
当然,现在有PHP多线程的解决方案和基于协程的解决方案,可以让PHP更高效地处理WEB请求。
弱类型
与 JAVA 和 C/C++ 不同,PHP 是一种类型语言。变量的类型不必在声明时确定,并且类型也会在运行时明确。或者说隐式的类型改变,这也是PHP开发应用快捷方便的原因之一。
其他
Zend Engine + Ext扩展模式减少了内部耦合,可以轻松地添加和删除PHP本身的功能。
语法简单,强制规范不多。编程风格可以以过程或面向对象的方式开发。当然,也可以采用功能性风格。
PHP架构
基于当前主流版本PHP、PHP7、PHP5,架构如上图所示。它主要由四层组成。从下到上分别是 Zend 引擎、Extensions 扩展、SAPI 接口和上层。应用。
Zend 引擎
Zend 引擎是 PHP4。后来它被添加到 PHP 中。它是原始 PHP 解释器的重写。它完全使用C语言开发。换句话说,PHP可以理解为一种用C语言编写的编程语言,软件和引擎的作用就是将PHP代码翻译成一种称为操作码的中间语言,类似于JAVA的字节码(Bytecode)。
引擎将在PHP代码中执行四个步骤:
- 词法分析扫描(lexing),将PHP代码转换为语言片段(token)。
- 解析,将标记转换为简单且有意义的表达式。
- Compilation 编译,编译表达式和操作码。
- 执行执行,依次执行操作码,一次一个,实现表达PHP代码的功能。
APC、Opchche 这些扩展可以缓存操作码,以加快 PHP 应用程序的运行速度。如果您使用它们,当请求再次出现时,您可以跳过前三个步骤。
引擎还实现了基本的数据结构、内存分配和管理,并提供了相应的API方法供外部调用。
Extensions 扩展
常用的内置函数和标准库都是通过扩展来实现的。这些被称为 PHP 的核心扩展。用户还可以根据自己的需求安装PHP扩展。
SAPI
SAPI 是服务器应用程序编程接口的缩写。中文是服务器应用程序编程接口。它使得PHP能够通过一系列的钩子函数与外设交换数据。 SAPI是PHP与外部环境之间的代理。它连接外部环境抽象后,为PHP内部提供了一套固定的、统一的接口,使PHP自身的实现不受复杂的外部环境的影响,保持一定程度的独立性。
通过解耦SAPI,PHP可以不再考虑如何兼容不同的应用程序,应用程序本身也可以根据自身的特点实现不同的处理方式。
上层应用程序
程序员编写的PHP程序,无论是Web应用程序还是以cli方式运行的应用程序,都是上层应用程序。 PHP 程序员的主要任务是编写它们。
总结
如果你学过Android开发的话,这些东西显然更容易理解,因为Android的架构看起来和PHP的架构非常相似。明白了这一点,你就明白为什么PHP的创始人说PHP开发其实不需要框架了,因为PHP本身的设计就是类似于框架的东西。用汽车来比喻,PHP本身就是汽车的骨架。 Zend是发动机,Ext是车轮、方向盘和其他汽车部件,SAPI是道路。
有些人可能会觉得这个内容有点无用,因为很多人偏执地认为他们只是司机。为什么司机应该了解汽车如何行驶,他们甚至认为了解如何制造汽车。我是这么想的,直到我翻译了 Laravel 文档,Laravel 的作者启发了我,我也将这些话送给读过这篇文章的你:
如果你在“现实世界”中使用任何工具,如果你了解其工作原理了解了这个工具的原理,那么你就会对这个工具更加得心应手。应用程序开发也是如此。一旦您了解了开发工具的工作原理,您就会更轻松地使用它们。
本文档的目的是让您更好地了解 Laravel 框架的工作原理以及工作原理。通过对框架有清晰的了解,一切都会变得不那么“神奇”,您将更有信心构建应用程序。
作者:麦索
链接:https://juejin.im/post/5a926e02f265da4e7a7874e0
来源:掘金属于作者所有。如需商业转载,请联系求作者授权。非商业转载请来源。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。