PHP的设计理念及特点

  • 多进程模型

    由于PHP是多进程模型,不同请求间互不干涉,这样保证了一个请求挂掉不会对全盘服务造成影响,当然,随着时代发展,PHP也早已支持多线程模型。

  • 弱类型语言

    和C/C++、Java、C#等语言不同,PHP是一门弱类型语言。一个变量的类型并不是一开始就确定不变,运行中才会确定并可能发生隐式或显式的类型转换,这种机制的灵活性在web开发中非常方便、高效。

  • 引擎(Zend)+组件(ext)的模式降低内部耦合。

  • 中间层(sapi)隔绝web server和PHP。

  • 语法简单灵活,没有太多规范。缺点导致风格混杂,但再差的程序员也不会写出太离谱危害全局的程序。

PHP的构成

PHP源码主要目录有下列几个:

  • SAPI:全称是Server Application Programming Interface,也就是服务端应用编程接口,SAPI层可以适配不同的应用环境,可以认为是PHP的宿主环境。SAPI通过一系列构造函数,使得PHP可以和外围交互数据,这是PHP非常优雅和成功的一个设计,通过SAPI成功的将PHP本身和上层应用解耦隔离,PHP可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。-

    常用的两个SAPI是Cli和Fpm,另外还有Embed,这三种是比较典型的SAPI,除此还有litespeed和apache2handle,除了Cli和Fpm其他都是配合其他应用使用的。

  • main:PHP的主要代码,主要是输入/输出、web通信,以及PHP框架的初始化操作(如FASTCGI协议的解析、扩展的加载、PHP配置解析等工作)等,位于ZendVM的上一层。

  • ZendVM:是一个虚拟计算机,介于PHP应用与实际计算机之间,用于解析执行PHP代码。ZendVM是PHP语言的核心部分,PHP的代码解释、执行就是由Zend完成的。Zend整体用纯C实现,它将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。

    虚拟机的特点是实现跨平台,只需要按照不同平台编译出对应的解析器就可以实现代码的跨平台执行。

  • ext(Extension):扩展是PHP内核提供的一套用于扩充PHP功能的一种方式,PHP社区中有丰富的扩展可供使用。围绕着Zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的。

    通过扩展,可以使用C/C++实现更强大的功能和更高的性能。扩展可分为PHP扩展、Zend扩展(主要应用于ZendVM)。

    PHP的基本构成

PHP的生命周期

从main()开始,PHP生命周期分为以下几个阶段:

  • 模块初始化阶段(module startup)
  • 请求初始化阶段(request startup)
  • 执行脚本阶段(execute script),编译解析执行。
  • 请求关闭阶段(request shutdown)
  • 模块关闭阶段(module shutdown)

    PHP生命周期

不同的SAPI的实现,各个阶段的执行情况会有一些差异。

PHP实现一个典型动态语言的执行过程:

  • 拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes);
  • ZEND虚拟机顺次执行这些指令完成操作,进行语义解析,然后通过执行引擎执行。

PHP本身是用C实现的,因此最终调用的也都是C的函数,实际上,可以把PHP看做是一个C开发的软件

参考:

  1. 秦朋 《PHP7内和剖析》第1.4/5节
  2. PHP的运行机制与原理(底层)
  3. PHP底层的运行机制与原理

PHP的构成及工作原理相关推荐

  1. 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...

  2. 深入理解Nginx工作原理

    1 反向代理 1.1 概念 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给intern ...

  3. 高频开关电源原理_程控开关电源的工作原理

    本文介绍了开关电源的工作原理以及它的特点. 程控开关电源要要比线性电源复杂得多. 下图是典型的开关电源工作原理图. 首先对 220 V/50Hz 的 AC 输入,通过桥式整流器进行整流 储能电容对整流 ...

  4. Servlet生命周期与工作原理

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  5. java的工作原理你知道吗_每天用Mybatis,但是Mybatis的工作原理你真的知道吗?

    近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件:SqlSession Executor Stat ...

  6. linux网络管理原理,Linux__网络管理(物理层 数据链路层 网络层工作原理)

    千锋云计算逆战班11点后打卡 今天学习后,进行复习下,物理层 数据链路层  网络层 的工作原理 物理层关心的两件事情:1.信号 2.介质 先说信号:信号分为模拟信号和数字信号 模拟信号: 模拟信号,不 ...

  7. HDD工作原理 导图

    以上导图介绍了我们使用的 (HDD)机械硬盘的基本构造以及核心工作原理,对于大家扫盲有所帮助 参考文档: https://blog.csdn.net/yizhaoxin/article/details ...

  8. 路由和交换机工作原理

    路由器与交换机的工作原理 计算机网络往往由许多种不同类型的网络互连连接而成.如果几个计算机网络只是在物理上连接在一起,它们之间并不能进行通信,那么这种"互连"并没有什么实际意义.因 ...

  9. Google工作原理

    今天在晚上看到一个图,讲解google的工作原理,感觉写的不错.贴过来方便以后深入的研究. 转载于:https://www.cnblogs.com/muyuge/archive/2010/07/06/ ...

  10. 【摄像头】摄像机工作原理

    1.摄像机工作原理 外部光线穿过镜头(lens)后, 经过滤光片(color filter)滤波后照射到光学传感器(Sensor)上面, Sensor 将从 lens 上传导过来的光线转换为电信号,再 ...

最新文章

  1. android图片保存形式,Android应用开发之Android ScrollView截图和图片保存到相册的方式...
  2. CNN与Transformer结合,东南大学提出新架构 ConvTransformer
  3. java实现两个字符串相连接_P005 实现两个字符串的连接 ★
  4. win10键盘全部没反应_Win10的键盘失灵解决办法
  5. Android:通过Intent传递对象、Parcelable
  6. java mongodb-crud
  7. ucgui界面 vc_【MM32F103试用体验】ucGUI + FreeRTOS +触摸屏图形界面开发
  8. 【论文泛读08】基于深度时空残差网络的城市人群流动预测
  9. h5大前端常用网站以及npm模块整理
  10. 论文阅读:RGCF: Refined Graph Convolution Collaborative Filering with Concise and Expressive Embedding
  11. altf4不管用.是因为未使用内置管理员账户.
  12. 午饭加喝酸奶可减轻电脑辐射
  13. Java第三章-数组
  14. 2020年有寓意的领证日期_2020年领结婚证的好日子,2020年领证寓意好日子
  15. java yyyy-mm-ddthh:mm:ssz,解析格式为YYYY-MM-DDTHH-MM-SSZ的ISO 8601日期时间
  16. 小球间完全弹性斜碰(赋Python代码)
  17. CSS组件_0 燕尾
  18. 在pycharm中使用arcpy
  19. ClickHouse 基本语法(一)
  20. 计算机基础知识赏花主观题,计算机学院学生制作校园赏花地图

热门文章

  1. ImportError: No module named 'commands'
  2. 设计模式系列之单例模式(java)
  3. 批量管理Linux服务器,命令行工具Omnitty
  4. python后端技术栈_Python后端技术栈(三)--设计模式
  5. 设置tomcat过期缓存
  6. Eclipse RCP 中使用UTF8编码出现乱码问题的解决办法
  7. 向web服务器传文件,c++实现向web服务器上传文件
  8. c语言结果九位数,C语言实例:九位累进可除数
  9. html 子级选择器,css3子选择器(选择某个标签做内容)
  10. mariadb mysql 5.6_MySQL 5.6 和 MariaDB-10.0 的性能比较测试