PHP 7 详解
  • 介绍
  • PHP 7 安装
  • PHP 7.0.x 新特性
    • OOP 特性
      • 类型声明
      • 命名空间与use关键词批量声明
      • 匿名类
      • Throwable 接口
    • 新增操作符
      • 太空飞船操作符(<=>)
      • null 合并运算符(??)
    • 统一变量语法
    • 其他特性和变更
      • 常量数组
      • Switch 中的多个default默认值
      • Session_start 函数中的参数数组
      • Unserialize 函数引入过滤器
      • 整数除法函数 intdiv()
      • 补充*其他特性和变更
    • 补充*新函数
    • 补充*新的全局常量
    • 补充*变更的函数
    • 补充*摒弃一些老式的写法
    • 补充*不向后兼容的变更
    • 补充*在SAPI模块的变化
    • 补充*PHP7底层性能优化
  • PHP 7.1.x 新特性
    • 新特性
      • 可为空(Nullable)类型
      • 对称阵列解构
      • Void 函数
      • 类常量访问权限控制
      • 多异常捕获处理
      • list()现在支持键名
      • 支持为负的字符串偏移量
      • 补充*其他特性与变更
    • 补充*新的函数
    • 补充*新增的全局常量
    • 补充:不向后兼容的变更
    • 补充*废弃的特性
    • 补充*变更的函数
    • 补充*其他的变更
  • PHP7 开发工具
    • Eclipse 安装与配置
  • PHP 标准规范及开发技巧
    • PHP 标准规范 - PSR
    • PHP 开发技巧
    • 面向对象编程的基本原则
  • PHP7调试与性能分析
    • 调试 - Xdebug安装配置
      • 使用Eclipse调试
    • 性能分析 - Xhprof
    • 性能分析 - Vld
  • 附录*Ubuntu环境php开发配置
  • 附录*使用php开发扩展
  • 附录*浏览器插件
  • 附录*第三方类库
  • 附录*小问题整理
  • 附录*资料*工具
  • 附录*Composer
  • 附录*前端
  • 附录*进程
  • 附录*PHP的ticks机制
  • 附录* 通过composer发布自己的包
  • 附录*字符编码问题
  • 附录*注释
Powered by GitBook
On this page
  • 目录:
  • zval使用栈内存
  • zend_string存储hash值,array查询不在需要重复计算hash
  • zend_parse_parameters改为宏实现,性能提升5%
  • 新增加了4种OPCODE, call_user_function,is_int/string/array,strlen,defined 4个函数变为PHP OpCode指令,速度更快
  • 其他更多性能优化:
  • 其他:PHP7.0-final版本不会携带JIT特征

Was this helpful?

  1. PHP 7.0.x 新特性

补充*PHP7底层性能优化

Previous补充*在SAPI模块的变化NextPHP 7.1.x 新特性

Last updated 6 years ago

Was this helpful?

请参考视频资料:

目录:

  • zval使用栈内存

  • zend_string存储hash值,array查询不在需要重复计算hash

  • zend_parse_parameters改为宏实现,性能提升5%

  • 新增加了4种OPCODE, call_user_function,is_int/string/array,strlen,defined 4个函数变为PHP OpCode指令,速度更快

  • 其他更多性能优化:

  • 其他:PHP7.0-final版本不会携带JIT特征

zval使用栈内存

在Zend引擎和扩展中,经常要创建一个PHP变量,底层就是一个zval指针。之前的版本都是通过MAKE_STD_ZVAL动态从堆上分配一个zval内存。而PHP7可以直接使用栈内存。

32字节-》16字节

这样做的好处:大量节省了内存分配和内存管理的工作,性能就会得到很大的提升。

PHP 5

zval *val; MAKE_STD_ZVAL(val);

PHP7

zval val;

zend_string存储hash值,array查询不在需要重复计算hash

PHP7为字符串单独创建了新类型叫zend_string,除了char *指针和长度之外,增加了一个hash字段,用于保存字符串的hash值。数组键值查找不需要反复计算hash值。

struct _zend_string {
    zend_refcounted gc;
    zend_ulong      h;
    size_t          len;
    char            val[1]
};

为了优化数组的键值查找性能,h即为存储hash值的字段。

hashtable桶内直接存数据,减少了内存申请次数,提升了Cache命中率和内存访问速度

PHP 7 新的hashtable实现:

zend_parse_parameters:是从php变量到C扩展函数之间交换一些参数,还有交换返回值,这时候要用zend_parse_parameters函数来实现。

新增加了4种OPCODE, call_user_function,is_int/string/array,strlen,defined 4个函数变为PHP OpCode指令,速度更快

其他更多性能优化:

如基础类型为int,float,bool等改为直接进行值拷贝;排序算法改进,PCRE with JIT(正则表达式直接编译成机器码), execute_data和opline使用全局寄存器,使用gdb4.8的PGO功能(运行一段时间,它会导出一份运行时的数据统计)

其他:PHP7.0-final版本不会携带JIT特征

请参考视频资料: PHP7 与 JIT

JIT是just in time的缩写,表示运行时将指令转为二进制机器码。

为什么PHP7中没有引入JIT ? 原因:JIT对于实际项目,如WordPress没有太大的性能提升。

但是:对于计算密集型程序,JIT可以将PHP的OpCode直接转换为机器码,大幅提升性能。 PHP开发组已重启JIT开发计划,我看了一下官方,截止到PHP7.1版本没有带有JIT特征。

老:之前的php底层HashTable的实现:

zend_parse_parameters改为宏实现,性能提升5%

PHP7 底层性能优化(一)
PHP7 底层性能优化(二)
http://www.cnblogs.com/mingaixin/p/4318805.html