当前位置:首页 » 编程语言 » php7性能

php7性能

发布时间: 2022-05-31 18:57:44

‘壹’ php7的PHP7特性

PHP 7.0.0 Alpha 1 使用新版的ZendEngine引擎,带来了许多新的特性,以下是不完全列表: 性能提升:PHP7比PHP5.6性能提升了两倍。 Improved performance: PHP 7 is up to twice as fast as PHP 5.6 全面一致的64位支持。 Consistent 64-bit support 以前的许多致命错误,现在改成抛出异常。Many fatal errors are now Exceptions 移除了一些老的不在支持的SAPI(服务器端应用编程端口)和扩展。Removal of old and unsupported SAPIs and extensions 新增了空接合操作符。The null coalescing operator (??) 新增加了结合比较运算符。Combined comparison Operator (<=>) 新增加了函数的返回类型声明。Return Type Declarations 新增加了标量类型声明。Scalar Type Declarations 新增加匿名类。Anonymous Classes

‘贰’ PHP7卓越性能背后的原理有哪些

一 zval使用栈内存
在Zend引擎和扩展中,经常要创建一个PHP的变量,底层就是一个zval指针。之前的版本都是通过MAKE_STD_ZVAL动态的从堆上分配一个zval内存。而PHP7可以直接使用栈内存。PHP代码中创建的变量也进行了优化,PHP7直接在栈内存上预分配zval。这样节约了大量内存分配和内存管理的操作。
PHP5
zval *val; MAKE_STD_ZVAL(val);

PHP7
zval val;

二 zend_string存储hash值,array查询不再需要重复计算hash
PHP7为字符串单独创建了新类型叫做zend_string,除了char *指针和长度之外,增加了一个hash字段,用于保存字符串的hash值。PHP中array是核心数据结构,PHP程序中往往都有大量的$array[$key]操作,虽然hashtable查找的时间复杂度是O(1),但$key要转为hash值是要经过计算的。不仅仅是array操作,实际上PHP底层对于类属性、类方法、函数,访问时都要先通过hashtable查找到对应的指针,再执行对应的操作。PHP7之前Zend引擎会有大量的CPU时间用于计算hash值。
实际上PHP程序运行起来之后,大部分情况下$key的值都是不变的。PHP7干脆将这个hash值保存起来,下次直接使用,这样就节省了大量的hash计算操作,PHP的hashtable与C数组的性能一致。
三 hashtable桶内直接存数据
PHP5的hashtable每个元素都是一个 Bucket *,而PHP7直接存Bucket,减少了内存申请次数,提升了Cache命中率和内存访问速度。
四 zend_parse_parameters改为宏实现
PHP的C扩展函数与PHP中的变量进行参数输入时,要使用zend_parse_parameters()函数,这个函数根据一个字符串参数找到对应PHP的zval指针,然后进行赋值。 这个函数实际上有一定的性能消耗。PHP7直接使用宏替换了zend_parse_parameters函数,C扩展中不再需要使用zend_parse_parameters进行逐个参数的查找,宏展开后自动会实现参数赋值。仅此一项就提升了5%的性能。
五 新增加4种OPCODE
很多PHP程序中会大量使用call_user_function, is_int/string/array, strlen , defined 函数。PHP5 都是以扩展函数的方式提供,PHP7中这4类函数改成ZendVM的OPCODE指令,执行更快。
六 其他更多优化
除了上面5个主要优化点之外,PHP7还有其他更多的细节性能优化。如基础类型int、float、bool等改为直接进行值拷贝,排序算法改进,PCRE with JIT,execute_data和opline使用全局寄存器等等。PHP7对性能的优化会继续进行下去。

‘叁’ php7 性能怎么提升

1.用单引号来包含字符串要比双引号来包含字符串更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。
2.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
3.$row['id'] 的速度是$row[id]的7倍。
4.echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。
5.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。
6.注销那些不用的变量尤其是大数组,以便释放内存。
7.尽量避免使用__get,__set,__autoload。
8.require_once()代价昂贵。
9.include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。
10.如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME']要好于time()。
11.函数代替正则表达式完成相同功能。
12.str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。
13.如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。
14.使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。
15.用@屏蔽错误消息的做法非常低效,极其低效。
16.打开apache的mod_deflate模块,可以提高网页的浏览速度。
17.数据库连接当使用完毕时应关掉,不要用长连接。
18.错误消息代价昂贵。
19.在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。
20.递增一个全局变量要比递增一个局部变量慢2倍。
21.递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。

‘肆’ PHP7的性能,正式版会不会秒了其他脚本语言

> PHP7( phpng)的性能,正式版会不会秒了其他脚本语言?

和其他脚本语言比没有大多意义,因为应用场景不同。你不会用PHP像python那样写系统管理脚本,也不会用PHP跑Rails。

更有意义的,是和其他PHP版本的纵向比较。具体结果可Google: http://lmgtfy.com/?q=phpng+benchmark

> 一直想学runy、python,node.js但是正式用到机会不多。

一定要正式用才能逼自己学吗?

Ruby都拼不对。

> 所以一直就看看语法就放弃了。一直没深入。

就算是学习语法,光看是没用的,更重要的是做。

至于深入,学习语言的第一步是写出没有语法错误、可以完成任务的程序。一步登天想第一天就100% best practice是不可能的,瘦子吃不成胖子。至于更加深入的,比如语言的内部实现,我觉得90%的情况下即使你不去了解,问题也不大。也有小概率的情况的确碰到坑了,那么认真去挖一下坑,收获也会很大。

> 没深入学,其实跟没学一样,几个月看看语法,扔了,过几个月又想学,又看看语法,又扔了。

没什入学不代表跟没学一样,能用、增加了知识就能体现学习的价值。比如我学Haskell,书就看了几章,很多很高深的概念都不懂,但这不影响我欣赏Haskell,也开阔了我在FP方面的知识面。

你就是懒,没恒心。

> 听说PHP7性能太牛B后,更让我懒得深入了。。

不是很理解这个逻辑。

> 但是好像不会点小众语言,就好像不上档次一样。

1. PHP不是小众语言。
2. “上档次”如何定义?能吃吗?

> 一直想深入学,一直被打消念头。怎么样才能破这个局呢?

1. (optional) 读点心灵鸡汤,打点鸡血
2. 静下心来学,写点程序练

‘伍’ 鸟哥:让php7达到最高性能的几个tips

1. Opcache
记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前测试时期就发生了有人一直没有启用Opcache的事情. 启用Opcache非常简单, 在php.ini配置文件中加入:
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1"

2. 使用新的编译
使用新一点的编译器, 推荐GCC 4.8以上, 因为只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能提升(Wordpres的QPS角度衡量)
其实GCC 4.8以前的版本也支持, 但是我们发现它支持的有Bug, 所以必须是4.8以上的版本才会开启这个特性.
3. HugePage
前面文章介绍过
4. Opcache file cache
开启Opcache File Cache(实验性), 通过开启这个, 我们可以让Opcache把opcode缓存缓存到外部文件中, 对于一些脚本, 会有很明显的性能提升.
在php.ini中加入:
opcache.file_cache=/tmp
这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件, 可以跨PHP生命周期存在.
5. PGO
如果你的PHP是专门为一个项目服务, 比如只是为你的Wordpress, 或者drupal, 或者其他什么, 那么你就可以尝试通过PGO, 来提升PHP, 专门为你的这个项目提高性能.
具体的, 以wordpress 4.1为优化场景.. 首先在编译PHP的时候首先:
$ make prof-gen

然后用你的项目训练PHP, 比如对于Wordpress:
$ sapi/cgi/php-cgi -T 100 /home/zk/local/www/htdocs/ wordpress/index.php >/dev/null

也就是让php-cgi跑100遍wordpress的首页, 从而生成一些在这个过程中的profile信息.
最后:
$ make prof-clean$ make prof-use && make install

这个时候你编译得到的PHP7就是为你的项目量身打造的最高性能的编译版本.

‘陆’ php7的性能会赶上java

当然不可能,弱类型动态语言性能永远不可能比得上强类型静态语言。。解释型语言也永远不可能比编译型语言更快。。
这道理其实很简单。。。你告诉计算机的内容越详细,计算机需要自己去“猜”的东西就越少。。。自然性能就越好。。。别说PHP7,就算将来发展到PHP999,只要它是动态语言,只要它是解释型, 它就绝对不可能在性能上超越强JAVA。。。这是从原理上就不可能办到的事情。。。

‘柒’ php7新特性有哪些

1、性能提升:PHP7比PHP5.6性能提升了两倍。 Improved performance: PHP 7 is up to twice as fast as PHP 5.6
2、全面一致的64位支持。 Consistent 64-bit support
3、以前的许多致命错误,现在改成抛出异常。Many fatal errors are now Exceptions
4、移除了一些老的不在支持的SAPI(服务器端应用编程端口)和扩展。Removal of old and unsupported SAPIs and extensions
5、新增了空接合操作符。The null coalescing operator (??)
6、新增加了结合比较运算符。Combined comparison Operator (<=>)
7、新增加了函数的返回类型声明。Return Type Declarations
8、新增加了标量类型声明。Scalar Type Declarations
9、新增加匿名类。Anonymous Classes

‘捌’ 关于PHP5与PHP7的若干问题

一、
1、在Zend引擎和扩展中,经常要创建一个PHP的变量,底层就是一个zval指针。之前的版本都是通过MAKE_STD_ZVAL动态的从堆上分配一个zval内存。而PHP7可以直接使用栈内存。PHP代码中创建的变量也进行了优化,PHP7直接在栈内存上预分配zval。这样节约了大量内存分配和内存管理的操作。
2、zend_string存储hash值,array查询不再需要重复计算hash
3、PHP5的hashtable每个元素都是一个
Bucket
*,而PHP7直接存Bucket,减少了内存申请次数,提升了Cache命中率和内存访问速度。
4、PHP的C扩展函数与PHP中的变量进行参数输入时,要使用zend_parse_parameters()函数,这个函数根据一个字符串参数找到对应PHP的zval指针,然后进行赋值。
这个函数实际上有一定的性能消耗。PHP7直接使用宏替换了zend_parse_parameters函数,C扩展中不再需要使用zend_parse_parameters进行逐个参数的查找,宏展开后自动会实现参数赋值。仅此一项就提升了5%的性能。
5、很多PHP程序中会大量使用call_user_function,
is_int/string/array,
strlen
,
defined
函数。PHP5
都是以扩展函数的方式提供,PHP7中这4类函数改成ZendVM的OPCODE指令,执行更快。
除了上面5个主要优化点之外,PHP7还有其他更多的细节性能优化。如基础类型int、float、bool等改为直接进行值拷贝,排序算法改进,PCRE
with
JIT,execute_data和opline使用全局寄存器等等。PHP7对性能的优化会继续进行下去。
二、有一群人,
创建了一个PHP6的项目,
主要的目的是为PHP引擎增加Unicode支持.
当时开发者们同时维护5和6的开发,
慢慢的大家发现新功能都等着提交给6,
而6因为开发速度慢,
导致很多新特性没法提交,
状态很不理想.
再后来6就没人开发了
三、不太了解、我只用git下的php7主干代码

‘玖’ php7 数组和对象 哪个性能好

1.少用数组
1.大项目不利于维护,万一哪天修改了数据结构,改key,改到你怀疑人生,关键idea不给你报错,你只能自己找
2.整体效率也不是很高,比实体对象慢
3.特占内存
2.多用实体对象,少用匿名对象
1.匿名对象效率比数组还低,占用内存更高,速度还慢,还不利于维护
2.实体对象可以利于维护,后期数据结构修改了,至少idea能给你报错,能快速定位问题

‘拾’ php7与php5的区别

php5与php7之间的区别:
1、性能提升:PHP7比PHP5.0性能提升了两倍。
2、以前的许多致命错误,现在改成抛出异常。
3、PHP 7.0比PHP5.0移除了一些老的不在支持的SAPI(服务器端应用编程端口)和扩展。
4、PHP 7.0比PHP5.0新增了空接合操作符。
5、PHP 7.0比PHP5.0新增加了结合比较运算符。
6、PHP 7.0比PHP5.0新增加了函数的返回类型声明。
7、PHP 7.0比PHP5.0新增加了标量类型声明。
8、PHP 7.0比PHP5.0新增加匿名类。
9、错误处理和64位支持

热点内容
linux改变所有者 发布:2025-02-10 23:04:13 浏览:650
源码曹毅 发布:2025-02-10 23:04:01 浏览:582
odbcforsqlserver 发布:2025-02-10 22:26:37 浏览:600
区块链数据存储在那里 发布:2025-02-10 22:25:48 浏览:689
c语言for死循环 发布:2025-02-10 22:24:08 浏览:523
苹果限制访问初始密码 发布:2025-02-10 22:21:31 浏览:759
为什么安卓手机一年后卡顿 发布:2025-02-10 22:15:39 浏览:732
职工信息管理系统设计c语言 发布:2025-02-10 22:15:30 浏览:119
预算法的理念 发布:2025-02-10 22:15:25 浏览:133
如何结合商圈顾客特点配置货品 发布:2025-02-10 22:10:59 浏览:594