2020-03-26

PHP7 了解一下

1.PHP7介绍

介绍PHP7之前先大概说一下PHP以抛砖引玉。

PHP 主要是用于服务端的脚本程序,因此可以用 PHP 来完成任何其它的 CGI 程序能够完成的工作,例如收集表单数据,生成动态网页,或者发送/接收 Cookies。但 PHP 的功能远不局限于此。
PHP 脚本主要用于以下三个领域:

  • 服务端脚本。这是 PHP 最传统,也是最主要的目标领域。
  • 命令行脚本。可以编写一段 PHP 脚本,并且不需要任何服务器或者浏览器来运行它。
  • 编写桌面应用程序。对于有着图形界面的桌面应用程序来说,PHP 或许不是一种最好的语言,但可以利用 PHP-GTK 来编写这些程序。

PHP 能够在所有的主流操作系统上使用,包括 Linux、Unix 的各种变种(包括 HP-UX、Solaris 和 OpenBSD)、Microsoft Windows、Mac OS X、RISC OS 等。今天,PHP已经支持了大多数的 web 服务器,包括 Apache、Microsoft Internet Information Server(IIS)、Personal Web Server(PWS)、Netscape 以及 iPlant server、Oreilly Website Pro Server、Caudium、Xitami、OmniHTTPd 等。对于大多数的服务器,PHP 提供了一个模块;还有一些 PHP 支持 CGI 标准,使得 PHP 能够作为 CGI 处理器来工作。

  • 23年的发展历史
  • 迄今为止最流行的WEB开发语言
  • 78.8%的网站都会使用PHP作为他们的服务端开发语言(2020年3月25日w3techs数据)
使用各种服务器端编程语言的网站百分比

PHP7是PHP编程语言全新的一个版本,主要在性能方面获得了极大的提升。官方的文档显示,PHP7可以达到PHP5.x版本两倍的性能。同时还对PHP的语法做了梳理,提供了很多其他语言流行的语法格式。难能可贵的是,做了如此大的改动,PHP7的兼容性还是非常好的。对于绝大多数的应用来讲,可以不用做修改即可迁移到PHP7版本。

2.为啥升级PHP7,新特性介绍

2.1 安全支持

自2019年1月1日起,PHP官方将不再为PHP 5.6版本提供支持,使用PHP 5.6的网站未来不会再有安全漏洞和错误更新。另外PHP 7.0也已经在2018年12月1日停止安全支持。

2.2 快

最大特色是在性能上的大突破,能比前一版PHP5快上1到3倍。

为什么 PHP7 比 PHP5 性能提升了?
1、变量存储字节减小,减少内存占用,提升变量操作速度
2、改善数组结构,数组元素和hash映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率
3、改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率

2.3 PHP7 新特性

PHP7 新增了十几个新特性,下面列出了几个主要特性。

⑴ PHP 标量类型与返回值类型声明
PHP 7 增加了标量类型声明的特性,标量类型声明有两种模式:
① 强制模式 (默认)
② 严格模式
PHP 7 增加了对返回类型声明的支持,返回类型声明指明了函数返回值的类型。

⑵ 新增加的 NULL 合并运算符
NULL 合并运算符(??)是用于执行isset()检测的三元运算的快捷方式。
NULL 合并运算符会判断变量是否存在且值不为NULL,如果是,它就会返回自身的值,否则返回它的第二个操作数。

⑶ 新增加的太空船运算符(组合比较符)
该运算符用于比较两个表达式 $a 和 $b,如果 $a 小于、等于或大于 $b时,它分别返回-1、0或1。

⑷ PHP 常量数组
在 PHP 5.6 中仅能通过 const 定义常量数组,PHP 7 可以通过 define() 来定义。

⑸ PHP 匿名类
PHP 7 支持通过 new class 来实例化一个匿名类,这可以用来替代一些”用后即焚”的完整类定义。

⑹ PHP 7 异常
PHP 7 异常用于向下兼容及增强旧的assert()函数。它能在生产环境中实现零成本的断言,并且提供抛出自定义异常及错误的能力。
老版本的API出于兼容目的将继续被维护,assert()现在是一个语言结构,它允许第一个参数是一个表达式,而不仅仅是一个待计算的 string或一个待测试的boolean。

⑺ 错误处理
PHP 7 改变了大多数错误的报告方式。不同于 PHP 5 的传统错误报告机制,现在大多数错误被作为 Error 异常抛出。
这种 Error 异常可以像普通异常一样被 try / catch 块所捕获。如果没有匹配的 try / catch 块, 则调用异常处理函数(由 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。
Error 类并不是从 Exception 类 扩展出来的,所以用 catch (Exception $e) { … } 这样的代码是捕获不 到 Error 的。你可以用 catch (Error $e) { … } 这样的代码,或者通过注册异常处理函数( set_exception_handler())来捕获 Error。

⑻ PHP 7 Session 选项
PHP 7 session_start() 函数可以接收一个数组作为参数,可以覆盖 php.ini 中 session 的配置项。
这个特性也引入了一个新的 php.ini 设置(session.lazy_write), 默认情况下设置为 true,意味着 session 数据只在发生变化时才写入。
除了常规的会话配置指示项, 还可以在此数组中包含 read_and_close 选项。如果将此选项的值设置为 TRUE, 那么会话文件会在读取完毕之后马上关闭, 因此,可以在会话数据没有变动的时候,避免不必要的文件锁。

⑼ AST: Abstract Syntax Tree, 抽象语法树
AST在PHP编译过程作为一个中间件的角色, 替换原来直接从解释器吐出opcode的方式, 让解释器(parser)和编译器(compliler)解耦, 可以减少一些Hack代码, 同时, 让实现更容易理解和可维护.

PHP7增加了AST

同时,废弃了PHP4 风格的构造函数、以静态的方式调用非静态方法、password_hash() 随机因子选项、capture_session_meta SSL 上下文选项。也移除了ereg、mssql、mysql、sybase_ct四个扩展,移除了aolserver、apache、apache_hooks、apache2filter、caudium、continuity、isapi等近20个SAPI。

以上是PHP新增和摒弃的部分特性或函数、扩展等,PHP7的改变、优化其实不止这些,而且官方也在不断优化改进,提升PHP的性能。

3.PHP7代码执行的核心流程

PHP是解释型语言,其执行过程需先编译成中间代码,再经由特定的虚拟机,翻译成特定的指令被执行。

 PHP 代码 => 解析(词法分析得到 Token) => 抽象语法数 => Opcodes => 执行
PHP7代码执行的核心流程


(图3)PHP7代码执行流程
各个步骤内容如下:

  • 源代码通过词法分析得到Token

Token是PHP代码被切割成的有意义的标识。PHP7一共有137种Token,在zend_language_parser.h文件中做了定义。

  • 基于语法分析器将Token转换成抽象语法树(AST)

Token就是一个个的词块,但是单独的词块不能表达完整的语义,还需要借助一定的规则进行组织串联。所以就需要语法分析器根据语法匹配Token,将Token进行串联。语法分析器串联完Token后的产物就是抽象语法树(AST,Abstract Syntax Tree)。

AST是PHP7版本的新特性,之前版本的PHP代码的执行过程中是没有生成AST这一步的。它的作用主要是实现了PHP编译器和解释器的解耦,提升了可维护性。

  • 将语法树转换成Opcode

需要将语法树转换成Opcode,才能被引擎直接执行。

  • 执行Opcodes

opcodes是opcode的集合形式,是PHP执行过程中的中间代码。PHP工程优化措施中有一个比较常见的“开启opcache”,指的技术这里将opcodes进行缓存。通过省去从源码到opcode的阶段,引擎直接执行缓存好的opacode,以提升性能。

发表回复

Your email address will not be published. Required fields are marked *