神奇的PHP7
PHP7从正式问世到现在,算起来也有两年多了,开启了PHP的新里程,新架构,新思想。带来大幅的性能改进和新的特性,以及改进一些过时功能,移除一些就特性。
现在官网是已经更新到php7.2 RC5版本了,之前的旧版本主要讲究的是开发效率快,但是性能不是非常好,而php7主要就是追求高性能,侧重性能优化。在计算密集型的开发时,其性能极其低劣,远不如C/C++、java等语言。
如果PHP可以提升性能,将可以节约大量的服务器资源。Facebook就重写了PHP引擎HHVM,这是他们自己重写的,不是PHP官方的引擎。他们这样的目的就是提升性能,经实际测试,这性能提升了70%,这意味着性能已经大幅度地优化了。PHP官方重写了ZendVM,性能比PHP5.6提升了近300%,这在wordpress已经得到了证实,qps达到了311,性能几乎达到了2倍。如图:
- 错误异常
try {
non_exists_func();
} catch(EngineException $e) {
echo “Exception: {$e->getMessage();}\n”;
}
non_exists_func();
} catch(EngineException $e) {
echo “Exception: {$e->getMessage();}\n”;
}
- 使用zval内存(ZVAL结构的重构)
PHP5:
zval *val;MAKE_STD_ZVAL(val);
PHP7
zval val;
左边是PHP5的zval(24字节),右边是PHP7的zval(16字节);
可以看出来php7的zval要比php5还要复杂,但是却能从24个字节下降到16个字节,为什呢?
在C语言中struct的每一个成员变量要各自占据一块独立的内存空间,而union里的成员变量是共用一块内存空间(php7中大量使用union替换了struct)。因此,虽然成员变量看起来多了不少,但是实际占据的内存空间有很多都是公用的却下降了。
- Zend Array替换HashTale结构
如类的属性、类的方法都要hash查找,找到zval的指针,再执行相应的操作。早期版本zned引擎有大量时间用于CPU计算hash值。
- hashtable桶内直接存数据,减少了内存的申请次数,提升cache命中率和内存访问速度
早期的arBuckets的每一个桶存一次数据,就要申请一次内存,存n次得申请n次,而现在只要arData申请一个大内存,就可以有n个桶,存n次数据,这样速度就会提升了很多。如访问2号桶和4号桶时,因为他们在同一个内存页上,所以访问他们的时候,命中率就会高很多,速度急速提升。
- Zend_parse_parameters改为宏实现,性能提升5%
- 新增4种OPCODE
strlen => ZEND_STRLEN、defined => ZEND+DEFINED
- 基础类型直接改为值拷贝
- 排序算法改进
快速排序(非稳定排序) PHP7 快速排序+选择排序(稳定排序)
- PCRE with JIT
- 使用gdb4.8的PGO功能
- PHP7 JIT
- 64位的INT支持
- 支持存储大于2GB的字符串
- 支持上传大小大于2GB的文件
- 保证字符串在所有平台上【64位】都是64bit
- 新增几个运算符
** 【a的b次方】
?? NULL 合并运算符 //
如果 $_GET['user'] 不存在返回 'nobody',否则返回 $_GET['user'] 的值$username
= $_GET['user']
?? 'nobody';//
类似的三元运算符$username
= isset($_GET['user'])
? $_GET['user']
: 'nobody';
\u{xxxx} - Unicode字符的解析
整除运算符 intdiv()
intdiv(10,3) =>
int(3)
- 返回类型的声明