摘要:主要的變化有以下幾點(diǎn)抽象語(yǔ)法樹(shù)在之前的版本中,代碼在語(yǔ)法解析階段直接生成了指令,也就是在中直接生成指令,這使得編譯器與執(zhí)行器耦合在一起。
PHP7 從發(fā)布到現(xiàn)在已經(jīng)有快三年的時(shí)間了,現(xiàn)在已經(jīng)發(fā)展到 PHP7.2.9 版本了。它的發(fā)布給 PHP 帶來(lái)了很大的性能提升,這主要是得益于 PHP 對(duì) Zend 引擎的深度優(yōu)化,同時(shí)還降低了 PHP 對(duì)系統(tǒng)的資源占用。
主要的變化有以下幾點(diǎn):
抽象語(yǔ)法樹(shù)
在PHP之前的版本中,PHP代碼在語(yǔ)法解析階段直接生成了 ZendVM 指令,也就是在 zend_language_parser.y 中直接生成 opline 指令,這使得編譯器與執(zhí)行器耦合在一起。
PHP7 中增加了抽象語(yǔ)法樹(shù),首先是將PHP代碼解析生成抽象語(yǔ)法樹(shù),然后將抽象語(yǔ)法樹(shù)編譯為 ZendVM 指令。抽象語(yǔ)法樹(shù)的加入使得 PHP 的編譯器與執(zhí)行器很好地隔離開(kāi),編譯器不需要關(guān)心指令的生成規(guī)則,然后執(zhí)行器根據(jù)自己的規(guī)則將抽象語(yǔ)法樹(shù)編譯為對(duì)應(yīng)的指令,執(zhí)行器同樣不需要關(guān)心該指令的語(yǔ)法規(guī)則是什么樣子的。
Native TLS
PHP7 中使用 Native TLS(線程局部存儲(chǔ))來(lái)保存線程的資源池,簡(jiǎn)單地講就是通過(guò) __thread 標(biāo)識(shí)一個(gè)全局變量,這樣這個(gè)全局變量就是線程獨(dú)享的了,不同線程的修改不會(huì)相互影響。
指定函數(shù)參數(shù)、返回值類型
PHP7中可以指定函數(shù)參數(shù)及返回值的類型。
zval 結(jié)構(gòu)的變化
PHP7 將引用計(jì)數(shù)轉(zhuǎn)移到了具體的 value 中,這樣更合理。除此之外,zval 結(jié)構(gòu)的大小也從 24byte 少到了 16byte,這是 PHP7 能夠降低系統(tǒng)資源占用的一個(gè)優(yōu)化點(diǎn)所在。
異常處理
PHP5.x 中很多操作會(huì)直接拋出 error 錯(cuò)誤,PHP7 中將多數(shù)錯(cuò)誤改為了異常拋出,這樣一來(lái)就可以通過(guò) try catch 捕捉到。
HashTable 的變化
PHP7 中 HashTable 有非常大的變化,HashTable 結(jié)構(gòu)的大小從 72byte 減小到了 56byte,同時(shí),數(shù)組元素 Bucket 結(jié)構(gòu)也從 72byte 減小到了 32byte。
執(zhí)行器
在 PHP7 中不再采用傳參的方式,而是將 execute_data、opline 通過(guò)寄存器來(lái)進(jìn)行存儲(chǔ),避免了傳參導(dǎo)致的頻繁出入棧操作,同時(shí),寄存器相比內(nèi)存的訪問(wèn)速度更快。
新的參數(shù)解析方式
PHP5.x 通過(guò) zend_parse_parameters() 解析函數(shù)的參數(shù),PHP7 提供了另外一種方式,同時(shí)保留了原來(lái)的方式,但是新的解析方式速度更快。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/29314.html
摘要:生成器委托簡(jiǎn)單地翻譯官方文檔的描述中,通過(guò)生成器委托,可以將其他生成器可迭代的對(duì)象數(shù)組委托給外層生成器。外層的生成器會(huì)先順序委托出來(lái)的值,然后繼續(xù)本身中定義的值。文章介紹了的迭代生成器,協(xié)程,并實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的非阻塞服務(wù)器。 生成器委托 簡(jiǎn)單地翻譯官方文檔的描述: PHP7中,通過(guò)生成器委托(yield from),可以將其他生成器、可迭代的對(duì)象、數(shù)組委托給外層生成器。外層的生成器會(huì)先...
摘要:我們修改上面代碼,再來(lái)看下返回值類型限制的情況運(yùn)行結(jié)果這段代碼我們額外聲明了返回值的類型為型。對(duì)函數(shù)返回值的聲明做了擴(kuò)充,可以定義其返回值為,無(wú)論是否開(kāi)啟嚴(yán)格模式,只要函數(shù)中有以外的其他語(yǔ)句都會(huì)報(bào)錯(cuò)。 順風(fēng)車運(yùn)營(yíng)研發(fā)團(tuán)隊(duì) 王坤 發(fā)表至21CTO公眾號(hào)(https://mp.weixin.qq.com/s/ph...) showImg(https://segmentfault.c...
摘要:但在密集計(jì)算方面比等靜態(tài)編譯語(yǔ)言差幾十倍甚至上百倍。一使用棧內(nèi)存在引擎和擴(kuò)展中,經(jīng)常要?jiǎng)?chuàng)建一個(gè)的變量,底層就是一個(gè)指針。代碼中創(chuàng)建的變量也進(jìn)行了優(yōu)化,直接在棧內(nèi)存上預(yù)分配。應(yīng)用層與底層在錯(cuò)誤拋出的方式全部統(tǒng)一為異常。 原文:http://rango.swoole.com/archives/440最近PHP官方終于發(fā)布了傳說(shuō)中的PHP7,雖然只是alpha版。PHP7號(hào)稱是新一代的PHP...
摘要:引入了命名空間,這是規(guī)劃在中的功能,所以在一定程度上其實(shí)就是,的下一個(gè)版本是,即將發(fā)布,主要貢獻(xiàn)者是大名鼎鼎的鳥(niǎo)哥。使用修改為自動(dòng)載入路由配置新增注意替換數(shù)據(jù)庫(kù)密碼修改無(wú)需改動(dòng)。作者接受采訪時(shí)曾表示,是整個(gè)中最難實(shí)現(xiàn)的部分。 原文發(fā)表在我的個(gè)人網(wǎng)站:利用 Composer 一步一步構(gòu)建自己的 PHP 框架(四)——使用 ORM 本教程示例代碼見(jiàn) https://github.com...
摘要:而在面試過(guò)程中,也是經(jīng)常會(huì)遇到的,所以,無(wú)論是面試準(zhǔn)備還是日常開(kāi)發(fā),我們都應(yīng)該關(guān)注這方面的東西。二分法的基本做法是確定要查找的區(qū)間。區(qū)間內(nèi)選取二分點(diǎn)。根據(jù)二分點(diǎn)的值,綜合左右區(qū)間情況以及求解的目的,舍去一半無(wú)用的區(qū)間。 showImg(https://images.pexels.com/photos/935977/pexels-photo-935977.jpeg); 前言 面試是你進(jìn)入...
閱讀 3700·2023-04-26 02:24
閱讀 1010·2023-04-25 14:47
閱讀 2678·2021-11-24 11:16
閱讀 1833·2021-11-24 09:38
閱讀 1683·2021-11-18 10:07
閱讀 2133·2021-09-22 15:49
閱讀 1668·2019-08-30 15:55
閱讀 966·2019-08-26 13:38