PHP7比PHP5.0 ~ 5.6快了近5倍,同时还降低了对系统资源的占用。主要是PHP7对Zend引擎进行了深度优化。

之前在书上看到过两者比较全面的区别,回头去翻了翻书【眼过千遍,不如手过一遍啊】,特记录如下。

分三个方面来比较:

0、底层优化

1、语法变化

2、性能变化

0、增加抽象语法树(AST)。

PHP5:PHP代码在语法解析阶段直接生成opline指令,执行器直接执行opline指令。

PHP7: PHP代码解析生成抽象语法树,然后将抽象语法树编译成opline指令。解耦编译器和执行器。

1、Native TLS(线程局部存储)

PHP5: 通过参数传递的方式传递本线程资源池。容易遗漏、并且及其不优雅。

PHP7: 使用Native TLS来保存线程的资源池。

2、指定函数参数、返回值类型

PHP7: 指定了函数参数和返回值类型。

注意⚠️:如果类型不一致会报error错误。尝试了不太好用,比如int和string不好分,input过来的id=1是string, 代码中是int, 需要手动转换。

3、zval结构的变化。

PHP5: refcount__gc在zval中;zval结构大小24byte。

PHP7: refcount__gc在zval的value中;zval结构大小16byte。

3.1、PHP5 zval结构

定义文件{PHPSRC}/Zend/zend.h

typedef struct _zval_struct {

zvalue_value value;

zend_uint refcount__gc;

zend_uchar type;

zend_uchar is_ref__gc;

} zval;

typedef union _zvalue_value {

long lval;

double dval;

struct {

char *val;

int len;

} str;

HashTable *ht;

zend_object_value obj;

} zvalue_value;

typedef struct _zval_struct zval;

struct _zval_struct {

zend_value value;/* value */

union {

struct {

ZEND_ENDIAN_LOHI_3(

zend_uchar type,/* active type */

zend_uchar type_flags,

union {

uint16_t extra; /* not further specified */

} u)

} v;

uint32_t type_info;

} u1;

union {

uint32_t next; /* hash collision chain */

uint32_t cache_slot; /* cache slot (for RECV_INIT) */

uint32_t opline_num; /* opline number (for FAST_CALL) */

uint32_t lineno; /* line number (for ast nodes) */

uint32_t num_args; /* arguments number for EX(This) */

uint32_t fe_pos; /* foreach position */

uint32_t fe_iter_idx; /* foreach iterator index */

uint32_t access_flags; /* class constant access flags */

uint32_t property_guard; /* single property guard */

uint32_t constant_flags; /* constant flags */

uint32_t extra; /* not further specified */

} u2;

};

typedef union _zend_value {

zend_long lval;/* long value */

double dval;/* double value */

zend_refcounted *counted;

zend_string *str;

zend_array *arr;

zend_object *obj;

zend_resource *res;

zend_reference *ref;

zend_ast_ref *ast;

zval *zv;

void *ptr;

zend_class_entry *ce;

zend_function *func;

struct {

uint32_t w1;

uint32_t w2;

} ww;

} zend_value;

4、异常处理

PHP7将多数错误改为异常抛出。

PHP5: 调用的方法不存在报error。

PHP7: 可通过try catch捕获,使得错误处理更加可控。

try {

salmonl();

} catch (Throwable $e) {

var_dump($e->getMessage);

}

// PHP5下运行结果

// Fatal error: Call to undefined function salmonl() in [...][...] on line 3

// PHP7下运行结果

// Notice: Undefined property: Error::$getMessage in [...][...] on line 5

说明:PHP7下是通过Throwable异常类来捕获的,Throwable是父类,Exception类和Error类是子类。

5、HashTable的变化。

PHP5: HashTable结构大小72tye; 数组元素Bucket结构72byte。

PHP7: HashTable结构大小56tye; 数组元素Bucket结构32byte。

6、执行器。

PHP5: 通过执行器的调度函数execute_ex()传递execute_data和opline两个变量。

PHP7: execute_data和opline通过寄存器变量存储。

7、新的参数解析方式。

PHP7: 定义2个宏包裹待解析参数。

8、语法新特性

8.0、null合并运算符

// PHP5

$id = isset($_GET['id']) ? $_GET['id'] : 0;

// PHP7

$id = $_GET['id'] ?? 0;

8.1、太空船操作符

// PHP5

usort($datas, function ($a, $b) {

if ($a['score'] == $b['score']) {

return 0;

}

return ($a['score'] < $b['score']) ? 1 : -1;

});

// PHP7

usort($datas, function ($a, $b) {

return $b['score'] <=> $a['score'];

});

8.2、define定义常量数组

// version >= 5.6

const IT = ['sina', 'baidu', 'tencent'];

echo IT[0];

// version >= 7.0

define('IT', ['sina', 'baidu', 'tencent']);

echo IT[0];

参考:

《PHP7内核剖析》

手册:PHP7新特性

php7与php5的区别,PHP7和PHP5区别相关推荐

  1. PHP5.6升级PHP7总结

    前言 本文是一篇讲座听后+后续研究的总结. 话说当年追时髦,php7一出就给电脑立马装上了,php5和php7共存,也是立马写了个超级耗时间的循环脚本测了一番,确实php7给力很多,然后也是注意了一些 ...

  2. php5.3 php7兼容,Centos搭建PHP7.0.x让php5.3和php7兼容共存教程

    先安装php5.3 就不说,说Centos搭建PHP7.0教程: # wget  http://php.net/get/php-7.0.4.tar.gz/from/a/mirror 解压安装 # ta ...

  3. Cento7 PHP5.6 升级 PHP7.0.0

    下载PHP7包 wget http://am1.php.net/get/php-7.0.0.tar.gz/from/this/mirror 解压 tar xf php-7.0.0.tar.gz$cd ...

  4. php5.3 with-mysql centos_Centos编译搭建php7让php5.3和php7兼容共存教程

    PHP7版本现在在linux系统中已经开始使用起来了,下面我们来看一篇关于Centos搭建PHP7.0.x让php5.3和php7兼容共存教程,希望下文对各位有帮助. 先安装php5.3 就不说,说C ...

  5. php7安装memcached,PHP5.6与PHP7的memcached安装

    因需要兼容旧系统,所以服务器还保留了PHP5.6,有些比较新的系统就直接上PHP7了 PHP5.6的安装位置是 /usr/local/php PHP7的安装位置是 /usr/local/php7 在P ...

  6. 【PHP7源码分析】PHP7到底有多快,基准测试与特性分析告诉你

    顺风车运营研发团队 王坤 发表至21CTO公众号(https://mp.weixin.qq.com/s/ph...) PHP是一种跨平台开源语言,也是迄今为止最流行的Web开发语言,全球有超过80%的 ...

  7. php7协程通信使用,PHP7下的协程实现

    原标题:PHP7下的协程实现 什么是协程 先搞清楚,什么是协程. 你可能已经听过『进程』和『线程』这两个概念. 进程就是二进制可执行文件在计算机内存里的一个运行实例,就好比你的.exe文件是个类,进程 ...

  8. thinkphp3.1迁移php7,ThinkPHP3.1迁移到PHP7的注意事项

    ThinkPHP3.1迁移到PHP7的注意事项 2018.10.31 3723 小平 ThinkPHP3.1迁移到PHP7的注意事项 最近项目从PHP5.5升级到了PHP7.0,框架是ThinkPHP ...

  9. linux php 升级5.3,Linux php5.2.10升级到PHP5.3.29

    成都这边的程序员要求把PHP从5.2.10版本升级到5.3.29版本. #cd /Data/App_php/ #wget http://cn2.php.net/get/php-5.3.29.tar.g ...

最新文章

  1. 工作几年了,API 网关还不懂?
  2. Servlet学习DAY_02:重定向/ 文件上传/ Cookie和Session/ 导入一个工程 / 配置欢迎页面 / 同步请求和异步请求/JSON和AJax介绍 /过滤器
  3. opencv使用问题总结
  4. 波卡链Substrate (7)Grandpa协议一“概念说明”
  5. 在Linux上编写并运行Java文件
  6. Oracle B-Tree Index 原理
  7. html文件下的flag,推荐一个SAM文件中flag含义解释工具
  8. Postman用法简介-Http请求模拟工具
  9. 区块链教程(三):Solidity编程基础
  10. 传递function_Excel VBA解读(132): 调用Function过程的4种方式
  11. 网站服务器需要定期重启吗,数据库服务器需要定期重启吗
  12. SQLServer 删除表中重复数据(除ID不同的)
  13. 51单片机原理以及接口技术(四)--80C51的程序设计
  14. 视频编解码发展历程(从AVC到HEVC再到VVC)(一)
  15. 高薪物联网职业生涯所需的十大技能(转)
  16. 如何获取OpenAI API Key
  17. web的标准网页设计与php课后,web网页设计尺寸规范
  18. oracle安装缺少依赖包,ORACLE 安装提示缺少依赖包
  19. 春花秋月何时了,互联网广告系统知多少?
  20. Oracle 临时表、数据闪回、查询被锁表、系统常用表、及常用操作

热门文章

  1. 使用循环语句判定用户账号密码输入三次是否正确
  2. 关于打印机共享的注意事项——又被叫去修电脑了
  3. 在Vue中遇到的各种坑 及性能提升
  4. 深入理解 SVG 系列(一) —— SVG 基础
  5. 转:小城也有好去处(3):云南建水 - 丽江大理之后第三城
  6. MySQL 为什么表的数据删除一般,表文件大小不变?
  7. 实时动态测量技术的不足与改进方法
  8. MinGW问题解决:gcc: installation problem, cannot exec `cc1'
  9. 计算机视觉的发展历史
  10. Al芯片前景看好,市场规模在2023年将达343亿美元