记得我刚开始学习PHP的时候,许多面试官会常常问我PHP是什么,那时的标准回答是PHP是一种弱类型动态脚本编程语言,开源,免费,是超文本预处理器的缩写。android
这只是很浅的解释,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代码会执行四个步骤:
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 框架如何进行工做及它的工做原理。经过对框架进行全面的了解,一切都不会那么「神奇」,也将会让你更有自信的构建你的应用。