相信很多人都听说过 Zend Engine 这个名词,也有很多人知道 Zend Engine 就是 PHP 语言的核心,但若要问一句:Zend Engine 到底存在于何处?或者说,Zend Engine 究竟是在什么时候怎么发挥作用让 PHP 源码输出我们想要的东西的?

Zend引擎是PHP实现的核心,提供了语言实现上的基础设施。例如:PHP的语法实现,脚本的编译运行环境, 扩展机制以及内存管理等,当然这里的PHP指的是官方的PHP实现(除了官方的实现, 目前比较知名的有facebook的hiphop实现,不过到目前为止,PHP还没有一个标准的语言规范),而PHP则提供了请求处理和其他Web服务器的接口(SAPI)。

要理解 Zend Engine 的作用,就不能不理解为什么会出现,PHP 为什么需要 Zend Engine, Zend Engine 的出现为 PHP 解决了什么问题。PHP 发展到 3.0 版本的时候,此时 PHP 已经很普及了。“在 PHP3 的顶峰,Internet 上 10% 的 web 服务器上都安装了它”,PHP Manual 如是说。广泛的应用必然带来更高的要求。但此时的 PHP3 却有些力不从心了,这主要是因为 PHP3 采用的是边解释边执行的运行方式,运行效率很受其影响。其次,代码整体耦合度比较高,可扩展性也不够好,不利于应付各种各样需求。因此,此时在 PHP 界里已经有点中流砥柱作用的 Zeev Suraski 和 Andi Gutmans 决定重写代码以解决这两个问题。最终他们俩把该项技术的核心引擎命名为 Zend Engine,Zend 的意思即为 Zeev + Andi 。

Zend Engine 最主要的特性就是把 PHP 的边解释边执行的运行方式改为先进行预编译(Compile),然后再执行(Execute)。这两者的分开给 PHP 带来了革命性的变化:执行效率大幅提高;由于实行了功能分离,降低了模块间耦合度,可扩展性也大大增强。此时 PHP 已经能很方便的应付各种各样的 BT 需求了,而伴随 PHP 4.4.x ―可能是 PHP4 系列的最后一个分支―的发布,PHP 的大部分开发人员已经将注意力放在了 PHP5 或者 PHP6 上面,以后发布的基本上就是一些 Bug Fix Release。可以说第一代的 Zend Engine 是已经在站最后一班岗了。

2004 年 7 月,PHP 5 发布,支持 PHP5 的是 Zend Engine 2.0 版本。这个版本主要是对 PHP 的 OO 功能进行了改进(我没有提集成 SQLite、PDO 等特性是因为我们现在谈的主要是 Zend Engine 而非 PHP)。核心执行方式(非 OO 部分)较PHP4 的1.0 版本变动不大,所以 PHP5 纯粹的执行速度相对于 PHP4 没有大的提高。而预计将于本月中旬发布的 PHP 5.1 版本则会携带 Zend Engine 2.1 版本,这个版本将提供新的执行方式,执行速度也会快上许多,至少要比 PHP5.0 相对于 PHP4.x 的差别要大很多,所以,PHP 5.1 将会是一个很了很令人期待的版本。

但并非 PHP5 系列的 Zend Engine 2 就完美无缺了。前面已经提到过,Zend Engine 将代码分成编译和执行两大部分。一般情况下,我们的代码完成以后就很少再去改变了。但执行时 PHP 却不得不还得一次又一次的重复编译,这根本就是毫无必要的。而且通常情况下,编译的所花费的时间并不比执行少多少,说是五五开并不为过,因此这极大的浪费了机器的 CPU。基于 Zend Engine 3.0 的 PHP6 将试图解决这个问题。除此之外,目前的 PHP 对多字节的字符处理也是 PHP 的一大致命缺陷。这在人们联系日益国际化的今天几乎是不可忍受的。而无数人在抨击 PHP 或 比较 ASP 等同类语言时总是不可避免的要提到这一点。同时受到 IBM 方面的压力,PHP6 也将会把对多字节字符的处理提到首要日程。这在 PHP6 的 Dev 版本中已经得到体现。

目前PHP的实现和Zend引擎之间的关系非常紧密,甚至有些过于紧密了,例如很多PHP扩展都是使用的Zend API, 而Zend正是PHP语言本身的实现,PHP只是使用Zend这个内核来构建PHP语言的,而PHP扩展大都使用Zend API, 这就导致PHP的很多扩展和Zend引擎耦合在一起了,后来才有PHP核心开发者就提出将这种耦合解开的建议。

目前PHP的受欢迎程度是毋庸置疑的,但凡流行的语言通常都会出现这个语言的其他实现版本, 这在Java社区里就非常明显,目前已经有非常多基于JVM的语言了,例如IBM的Project Zero就实现了一个基于JVM的PHP实现, .NET也有类似的实现,通常他们这样做的原因无非是因为:他们喜欢这个语言,但又不想放弃原有的平台, 或者对现有的语言实现不满意,处于性能或者语言特性等(HipHop就是这样诞生的)。

很多脚本语言中都会有语言扩展机制,PHP中的扩展通常是通过Pear库或者原生扩展,在Ruby中则这两者的界限不是很明显, 他们甚至会提供两套实现,一个主要用于在无法编译的环境下使用,而在合适的环境则使用C实现的原生扩展, 这样在效率和可移植性上都可以保证。目前这些为PHP编写的扩展通常都无法在其他的PHP实现中实现重用, HipHop的做法是对最为流行的扩展进行重写。如果PHP扩展能和ZendAPI解耦,则在其他语言中重用这些扩展也将更加容易了。

延伸阅读

此文章所在专题列表如下:

php引擎,PHP内核探索:Zend引擎相关推荐

  1. PHP内核-Zend引擎的详解

    [精简版] 在前面的章节介绍了PHP的生命周期,PHP的SAPI,SAPI处于PHP整个架构较上层,而真正脚本的执行主要由Zend引擎来完成, 这一小节我们介绍PHP脚本的执行. 目前编程语言可以分为 ...

  2. 第一节 生命周期和Zend引擎

    一切的开始: SAPI接口 SAPI(Server Application Programming Interface)指的是PHP具体应用的编程接口, 就像PC一样,无论安装哪些操作系统,只要满足了 ...

  3. php内核探索方法与资源

    PHP内核探索 TIPI深入理解PHP内核 风雪之隅PHP源码分析 <php扩展开发及内核应用> 百度XLQ God's blog codinglabs PHP内核探索:从SAPI接口开始 ...

  4. php内核探索 [转]

    PHP内核探索:从SAPI接口开始 PHP内核探索:一次请求的开始与结束 PHP内核探索:一次请求生命周期 PHP内核探索:单进程SAPI生命周期 PHP内核探索:多进程/线程的SAPI生命周期 PH ...

  5. php sapi zend,108 内核探索 --php扩展、zend引擎、sapi

    php内核探索系列文章 :http://www.nowamagic.net/librarys/veda/detail/1285 1.php请求流程 先看一个php请求的运行流程: 浏览器用户---&g ...

  6. PHP内核探索:Zend引擎

    相信很多人都听说过 Zend Engine 这个名词,也有很多人知道 Zend Engine 就是 PHP 语言的核心,但若要问一句:Zend Engine 到底存在于何处?或者说,Zend Engi ...

  7. Zend引擎探索 之 PHP中前置递增不返回左值

    首先来讲,一般我们对"左值"的理解就是可以出现在赋值运算符的左侧的标识符,也就是可以被赋值.这样讲也许并不十分确切,在不同的语言中对左值的定义也不尽相同.在这里我们讨论前置递增(和 ...

  8. 【走进php内核】之 Zend引擎执行过程

    Zend引擎主要包含两个核心部分:编译.执行: 前面分析了Zend的编译过程以及PHP用户函数的实现,接下来分析下Zend引擎的执行过程. 1 数据结构 执行流程中有几个重要的数据结构,先看下这几个结 ...

  9. 探索推荐引擎内部的秘密

    "探索推荐引擎内部的秘密"系列将带领读者从浅入深的学习探索推荐引擎的机制,实现方法,其中还涉及一些基本的优化方法,例如聚类和分类的应用.同时在理论讲解的基础上,还会结合 Apach ...

最新文章

  1. 从Preact了解一个类React的框架是怎么实现的(一): 元素创建
  2. 程序员搞事!动手实战优化自己公司线上系统JVM,结果。。。
  3. 2019年陕西高考分数线出炉
  4. MySQL 子查询 嵌套查询
  5. css 一侧是三角形的矩形_5种具有CSS形状和滤镜的精美图像效果
  6. mysql卸载权限不够_Linu下启动MySQL结果显示:env: /etc/init.d/mysql:权限不够怎么解决?...
  7. 数据库备份和恢复秩序的关系(周围环境:Microsoft SQL Server 2008 R2)
  8. css3 页面翻转效果.
  9. 从数学上证明墨菲定律
  10. 禁止使用搜狗浏览器打开QQ邮箱,更换成其他邮箱
  11. 积分兑换系统怎样设置“新花样”?
  12. colsure php_PHP_PHP中Closure类的使用方法及详解,Closure,匿名函数,又称为Anonym - phpStudy...
  13. 2000、XP、2003所有注册表设置
  14. HTML知识点(来自广陵散老师)
  15. 电动车电池管理系统c语言实训,电动车控制器C语言源代码复习课程.doc
  16. 读取txt的中文字符出现乱码
  17. 2. 网络协议及硬件
  18. Backgrounds(背景)
  19. java实现三宫格及其扩展_使用css伪类before/after实现 正方形三宫格、正方形六宫格、正方形九宫格...
  20. 《大数据分析》期末大作业报告

热门文章

  1. 华为 鸿蒙只是物联网,“鸿蒙”不只是手机系统,任正非:是为物联网所打造的系统...
  2. java encodedurl_Java ParseUtil.fileToEncodedURL方法代码示例
  3. mongodb type
  4. linux 下如何安装php,详解在Linux下如何安装配置PHP
  5. Leetcode 91. 解码方法 (每日一题 20211013)
  6. Leetcode 12. 整数转罗马数字 (每日一题 20210827)
  7. MoCo论文中的Algorithm 1伪代码解读
  8. python笔记 print+‘\r‘ (打印新内容时删除打印的旧内容)
  9. 单变量线性回归程序实现
  10. 苹果企业证书_企业签名App稳定吗?