前几天看到php7发布了beta1版本,想了解一下php7到底折腾了些啥东西出来。这一了解发现不得了了,改变还挺多的。最最重要的方面就是性能提升了不少,这边有一个pdf文件是惠新宸(鸟哥,php核心开发者)关于php7的说明,请移步下载:惠新宸关于php7的说明文档
当然对于大部分企业来讲,不会因为一个新东西出来就盲目跟进,更多考虑的是迁移到新版本php7是否划算,比如性能究竟提升多少,兼容性如何,稳定性如何这些比较关键的问题,下面主要从这些方面聊下自己的看法。
性能提升
php7的性能提升可以说是这次主角,也是这次大家讨论比较多的话题,从bench.php的测试效果来看,php7比php5.6的性能提高了2~3倍,
![php7中bench.php测试](http://01happy-r.stor.sinaapp.com/uploads/2015/07/php7%E4%B8%ADbench.php%E6%B5%8B%E8%AF%95.jpg)
php7中bench.php测试
当然这种测试无法完全说明问题,看看wordpress的测试数据
![php7中wordpress性能测试](http://01happy-r.stor.sinaapp.com/uploads/2015/07/php7%E4%B8%ADwordpress%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95.jpg)
php7中wordpress性能测试
这个相对来说就比较有说服力了,并发请问wordpress的文章内容页,php7和php5.6相比在10,20,40的并发下都比php5.6快了1~2倍。不过重复请求一个页面的话,因为opcode、mysql查询等缓存机制,所以这一结果可能有些偏大,自己估计在真实的应用场景中,综合提升50%的性能应当是有的。
这个提升效果还是蛮恐怖的,理论上意味着服务器成本能节省1/3下来,一年1000万的服务器成本就能省300来万,想想也是醉了。当然如果说兼容性不好、迁移成本非常高,动不动出什么问题什么,那可能得不偿失,最好就是能够一行代码不用修改,直接迁移到新的运行环境。
php7性能的提升主要还是引入了phpng,这个phpng是下一代官方版PHP的核心执行引擎实现的内部名称。后续还计划引入JIT(Just In Time Compiler),根据文档显示在php5.5引入了JIT后,bench.php的提升了8倍左右。期待php7引入有更大的提升。
此外值得一提的是php7的数组,大家都知道php中的数组功能非常强大,也非常常用。php7的数组在内存占用量上比php5减少了一倍左右,更少的内存占用量必然导致更好的CPU缓存利用率,从而更好的提升性能。
![php7中数组内存使用减少说明](http://01happy-r.stor.sinaapp.com/uploads/2015/07/php7%E4%B8%AD%E6%95%B0%E7%BB%84%E5%86%85%E5%AD%98%E4%BD%BF%E7%94%A8%E5%87%8F%E5%B0%91%E8%AF%B4%E6%98%8E.jpg)
php7中数组内存使用减少说明
旧版本兼容性
迁移到新版本的语言下,兼容性方面往往是首要考虑的问题,如果兼容性不好,需要大量改动代码,一般都不会考虑迁移。如php6、python3版本在兼容性方面都饱受诟病。
根据鸟哥介绍php7将会保持99.99的向下兼容性,那么哪些地方不兼容呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class
Foo {
public
$name
=
"tom"
;
}
$keys
=
array
(
"0"
=>
"name"
);
$foo
=
new
Foo();
echo
$foo
->
$keys
[0];
//上面的语句在php5.6如同:
echo
$foo
->{
$keys
[0]};
//在php7中如同:
echo
{
$foo
->
$keys
}[0];
|
上面这种方式在平时的代码中使用并不多见,一般在写核心的底层框架,需要动态调用函数或者变量的时候才会使用到,不过为了兼容性方面以后可以稍微注意一下。
还有一个php数组排序问题
1
2
3
4
|
$array
=
array
(0 => 0, 1 => 0);
asort(
$array
);
//php5中$array: array(1=>0, 0=>0);
//php7中$array: array(0=>0, 1=>0);
|
这边代码排序上,php7中值一样的情况下,会按键值排序。
![php7中数组排序问题](http://01happy-r.stor.sinaapp.com/uploads/2015/07/php7%E4%B8%AD%E6%95%B0%E7%BB%84%E6%8E%92%E5%BA%8F%E9%97%AE%E9%A2%98.jpg)
php7中数组排序问题
这里应该是鸟哥笔误写错了。
此外有些兼容代码将被取消掉,比如以前的ASP风格的开始标签以及<script language=”php”>开始标签。
关于代码兼容性方面,目前暂时发现这么多,没有看到更多的内容,应该来讲兼容性方面都是不错的,后续发现新的兼容问题会陆续更新上来。
稳定性方面
目前php7还是beta1版本,根据官方的发布计划预计在11月份发布出最终版本
![php7官方发布时间表](http://01happy-r.stor.sinaapp.com/uploads/2015/07/php7%E5%AE%98%E6%96%B9%E5%8F%91%E5%B8%83%E6%97%B6%E9%97%B4%E8%A1%A8.jpg)
php7官方发布时间表
最终版本应当是没有什么大问题,但是小问题或多或少还有一些,预计3到6个月才会比较稳定,那时候诸如redhat、centos、ubuntu等一些发行版linux也应当会提供相应的安装包,安装起来就会更加方便了。
一些新语法
新语法并不会影响兼容问题,就不着重描述了,将来在使用的时候就会逐步应用到了,这里罗列一些
语法糖
1
2
3
4
5
6
7
8
9
10
11
|
$foo
()[
'bar'
]()
$foo
[
'bar'
]::
$baz
foo()() – (foo())()
$foo
->bar()::baz()
(
function
() { ... })()
$this
->{
$name
}()
[
$obj
,
'method'
]()
Foo::
$bar
[
'baz'
]()
//PHP5: Foo::{$bar['baz']}()
//PHP7: (Foo::$bar)['baz']()
|
内部的异常机制
1
2
3
4
5
6
7
8
9
10
11
|
//使用try捕获内部引擎异常,程序可以不中断
try
{
non_exists_func();
}
catch
(EngineException
$e
) {
//输出Exception: Call to undefined function non_exists_func()
echo
"Exception: {$e->getMessage()}\n"
;
}
//不使用try捕获,会直接提示错误,程序中断
//输出PHP Fatal error: Call to undefined function non_exists()
non_exists_func();
|
函数参数和返回值强类型声明
1
2
3
4
5
6
|
function
foo(int num)
function
bar (string name)
function
foobar() : float {}
function
add(int l, int r) : int {}
class
A {
public
function
start (bool start) {} }
|
为啥没有php6版本
这里扯一个题外话,很多刚入门php的小伙们不太了解为啥php5直接就到php7了。笔者记的08,09年那会php还是5.1,5.2版本的时候,php6就推出了,只是因为当时兼容性的问题,市场接纳程度很低。php官方就做出了调整,将php6的功能特性陆续在5.3、5.4和后面的版本实现了。为了和原先的php6区分开来,所以就定为php7版本了。
从这里也可以看出新东西的推出还是要市场驱动为导向,python3和python2也碰到类似的问题,以至于现在很多服务器上还是使用python2.7的版本,不知道现在这个问题解决了没有。
参考文章:
PHP7 与 HHVM 的效能之争
PHP 7中新的Hashtable实现和性能改进
php官网关于php7的说明