热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php7.0优缺点_【PHP】php7新特性及其优化原理

PHP7新特性php7.x增加的新特性介绍可以参考这里:php7.x版本系列相比之前的php的版本提交性能提高了不少,下图是wordpress在不同ph

PHP7新特性

php7.x增加的新特性介绍可以参考这里:

php7.x版本系列相比之前的php的版本提交性能提高了不少,下图是wordpress在不同php版本下的压力测试表现。

0c77f5230e52ec0ec5e63f7517e59997.png

f4f5b29a6662b11a4a74b87327ed9951.png

这里面其中的一些主要改变是性能提高的关键,主要有以下内容。

1.zval使用栈内存

在zend引擎和扩展中,经常要创建php变量,其底层就是一个zval指针,之前的php版本都是通过MAKE_STD_ZVAL动态的从堆内存上分配一个zval内存。而php7直接使用栈内存,好处是少了一次内存分配。php程序中回大量创建变量,所以php7会在栈上预分配一块内存来存放这些zval,来节省大量的内存分配和管理操作。

php5

zval *val ; MAKE_STD_ZVAL(val)

php7

zval val;

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

数组是php比较重要的数据结构,php程序中会有大量的array关联查询,虽然hashtable查找的复杂度是O(1),但是key的值每次要转化成一个hash值,需要用一个复杂的hash函数去计算的,这样就会占用cpu时间,不过不光数组,在php底层很多地方都会用到hashtable,比如类的属性方法函数等。其实php程序运行起来大部分key的值是不变的,所以php7就保存了这些hash值下次直接使用,那么php7就为字符串单独创建了新类型叫做zend_string,除了char*指针和长度之外,增加了一个hash字段,用于保存字符串的hash值,数据键值查找不再反复需要计算hash值。为了优化数组的键值查找。

150f949c1d3d7a0f37dbd84de31526db.png

上图代码中 zend_ulong h;就是存储hash值。

3.hashtable桶内直接存放数据,减少了内存申请次数,顺便也提升了cache命中率和访问速度。因为指针不是连续的是分布在不同的内存页上,如果读取第一个或者第三个桶,它们的数据可能会在两个页上。

php7之前

47f77fcb869fd90c18c6d08b50f1355a.png

数据存放是在上图arBuckets这个结构体上,存放了一些bucket * 指针,指针上就是对应了一些数据。php7对这些做了一些改进,如下图。

php7

478c3e4096d80de75e76aac2418c8b48.png

php7将之前arBuckets改成了上图中的arData,而这个arData直接就是一个大块内存,这个内存上面就是一个个桶bucket,这样的好处就是每次数据就不需要动态去申请内存。

4.zend_parse_parameters改为宏实现,性能提升15%。

5.新增加4种opcode,call_user_function(),is_int(),is_string(),is_array(),strlen(),defined() 4个函数变为php opcode指令,速度更快。

6.PHP7 的内核中有一个重要的变化是加入了 AST(Abstract syntax tree)抽象语法树,指代码在计算机内存的一种树状数据结构,树上的每个节点都表示源代码中的一种结构,便于计算机理解和解析。

be4377cdaf904feb3fcf9790cbc6acd0.png

在 PHP5系列版本中,从 php 脚本到 opcodes 的执行的过程如下:

词法扫描分析(Lexing):将源文件转换成 token 流;

语法分析(Parsing):生成 op arrays。

PHP7 中在语法分析阶段先生成 AST:

词法扫描分析(Lexing):将源文件转换成 token 流。

语法分析(Parsing):从 token 流生成抽象语法树。

Compilation:从抽象语法树生成 op arrays。

这个表达式($a)['b'] = 1 就会被解析成下图这样的一棵树结构

d7664ad395270cf06030630f90bbcfd1.png

7.其他更多性能优化,如基础类型 float , int , bool等改成直接进行值拷贝。排序算法改进了,PCER with JIT , execute_data和opline使用全局寄存器,使用gdb4.8的PGO功能。

8.php7与JIT

最初HHVM退出一个很重要的特性就是JIT,JIT就是just in time的缩写,表示运行时候将指令转换成二进制机器码,我们知道C和C++是将源代码编译然后生成二进制机器码去执行的,而php,python等脚本语言是将源代码转换成中间指令然后在vm(虚拟机)上执行,另外java系语言他们使用的JVM引擎底层也是JIT,是将java的字节码编译成二进制的机器码去执行的。对于计算密集型的的程序,JIT可以将PHP的opcode直接转换成机器码,可以大幅度提升PHP性能。

不过PHP7.0-final版本中不会带有JIT特性的。

但是

为什么php7版本没有使用JIT呢?

是因为php官方之前有个php中间版本是带有JIT的,后来php官方开发组使用JIT测试时候发现JIT对于实际项目的性能没有太大的性能提升,所以最终放弃使用JIT方案。但后来发现密集计算性的php程序使用JIT后性能还会大幅提升。

PHP7下载与安装

1.第一步 下载源代码

wget https://www.php.net/distributions/php-7.2.21.tar.bz2

2.第二步 解压源代码

tar -xjvf php-7.2.21.tar.bz2

3.第三步 进入目录

cd php-7.2.214.第四步 执行configure shell脚本检测环境及配置php安装目录 比如检测php安装是否必须要有gcc 和 authconfig等工具

./configure --prefix=/usr/local/src/php7

出现下面提示说明上面执行成功

Generating files

configure: creating ./config.status

creating main/internal_functions.c

creating main/internal_functions_cli.c+--------------------------------------------------------------------+

| License: |

| This software is subject to the PHP License, available in this |

| distribution in the file LICENSE. By continuing this installation |

| process, you are bound by the terms of this license agreement. |

| If you do not agree with the terms of this license, you must abort |

| the installation process at this point. |

+--------------------------------------------------------------------+Thank youforusing PHP.

5.第五步 编译安装make && make install

出现下面提示说明make成功

clicommand.inc

directorygraphiterator.inc

invertedregexiterator.inc

pharcommand.inc

phar.inc

Build complete.

Don't forget to run 'make test'.

出现下面提示说明make install成功

Installing PEAR environment:      /usr/local/src/php7/lib/php/

[PEAR] Archive_Tar    - installed: 1.4.7

[PEAR] Console_Getopt - installed: 1.4.2

[PEAR] Structures_Graph- installed: 1.1.1

[PEAR] XML_Util       - installed: 1.4.3

[PEAR] PEAR           - installed: 1.10.9

Wrote PEAR system config file at: /usr/local/src/php7/etc/pear.conf

You may want to add: /usr/local/src/php7/lib/php to your php.ini include_path

/usr/local/src/php-7.2.21/build/shtool install -c ext/phar/phar.phar /usr/local/src/php7/bin

ln -s -f phar.phar /usr/local/src/php7/bin/phar

Installing PDO headers:           /usr/local/src/php7/include/php/ext/pdo/

验证php安装成功

songguojundeMBP:php7 songguojun$ pwd

/usr/local/src/php7

songguojundeMBP:php7 songguojun$lsbin etc include lib php var

songguojundeMBP:php7 songguojun$ cd bin/songguojundeMBP:bin songguojun$ ./php-v #显示php版本 下面打印出php版本说明php安装成功

PHP7.2.21 (cli) (built: Feb 22 2019 22:19:32) ( NTS )

Copyright (c)1997-2018The PHP Group

Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

如果php命令找不到就添加到启动文件中

songguojundeMBP:~ songguojun$ vim ~/.bash_profilealias ll='ls -alF'alias la='ls -A'export PATH="/usr/local/opt/libiconv/bin:$PATH"alias php=/usr/local/src/php7/bin/php

songguojundeMBP:~ songguojun$ source ~/.bash_profil

源码安装可能会出现的问题:

1. 缺少libiconv提示

checking foriconv support... yes

checkingforiconv... no

checkingforlibiconv... noconfigure: error: Please specify the install prefix of iconv with --with-iconv=

下载libiconv库

brew install libiconv



推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
author-avatar
__乀余海燕v
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有