⑴ 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新建扩展时,make编译时报 unknown type name 'zend_string'
你希望用php7的环境编译,但是你编辑的环境实际上是php5的。
php5 里面没有zend_string类型,用 char 替换,或者,修改你的php版本环境到php7
⑶ php和Java的区别是什么
首先从概念上区分,Java是一门面向对象编程语言,具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特性;PHP是一种通用开源脚本语言,语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛。
其次从学习难易程度上区分,PHP比Java简单很多。Java对学历有要求,本科及以上学历的人群比较适合学Java、也能学会Java。而PHP的学历要求比较低,大专、初高中学历的人群也是可以学会PHP的。
第三从应用领域上区分,PHP主要是应用在网站方面,它适合快速开发,中小型应用系统,开发成本低,有什么变动也能及时调整。而Java的应用领域要广泛的多,因为Java有完善的框架,在多线程、高并发方面有着较好的稳定性,所以在网站、嵌入式领域、金融行业服务器、安卓应用等领域都需要Java开发人才。
最后从发展前景上区分,如果你以后想专注于WEB领域的发展,那么学PHP就够用了,而Java适用于大型系统,如果你不打算只做web就需要学Java了。职友集上统计的北京PHP开发的平均薪资为19260元每月,Java开发20440元每月,不论PHP还是Java前景都很不错。
⑷ php 5.0 与7.0有什么区别
PHP 7.0使用新版的ZendEngine引擎,带来了许多新的特性,其与相比,有如下特性:
性能提升:PHP7比PHP5.0性能提升了两倍。
全面一致的64位支持。
以前的许多致命错误,现在改成抛出异常。
PHP 7.0比PHP5.0移除了一些老的不在支持的SAPI(服务器端应用编程端口)和扩展。
.PHP 7.0比PHP5.0新增了空接合操作符。
PHP 7.0比PHP5.0新增加了结合比较运算符。
PHP 7.0比PHP5.0新增加了函数的返回类型声明。
PHP 7.0比PHP5.0新增加了标量类型声明。
PHP 7.0比PHP5.0新增加匿名类。