按照发布计划,PHP 8 将于今年 11 月 26 日发布,而原定于 6 月 18 日发布的第一个 Alpha 版本跳票到了今天发布。
下载地址:https://downloads.php.net/~pollita
PHP 8 是一个新的主要版本,它引入了一些重大变更,以及许多新特性和性能改进,下边简单介绍一些亮点:
JIT,Just-In-Time,即时编译
最重大的特性非 JIT 莫属。该特性的研发历时多年,熬过了 PHP 5 与 7 大版本系列(PHP 6 项目流产),直到去年 3 月份才最终通过投票确认将进入 PHP 8。
JIT 是一种编译器策略,它将代码表述为一种中间状态,在运行时将其转换为依赖于体系结构的机器码,并即时执行。在 PHP 中,这意味着 JIT 将为 Zend VM 生成的指令视为中间表述,并以依赖于体系结构的机器码执行,也就是说托管代码的不再是 Zend VM,而是更为底层的 CPU。
虽然自 PHP 7.0 以来,通过优化核心数据结构 HashTable、强化 Zend VM 中某些操作码与持续改进 OPCache 的 Optimizer 组件等具体措施,PHP 性能得到了显著提升,但是实际上这些优化似乎已经走到极限了。现在 JIT 从底层着手,被认为是目前提升 PHP 性能的最佳出路。
关于引入 JIT 后的性能对比(以及 PHP 8 整体性能),可以参考一下本月 Phoronix 的基准测试(注:用的是 5 月底的源码构建版进行的测试)。
Union Types,联合类型
Union Types 支持接收多个不同类型的值,它是两种或多种类型的集合,使用时可以选择其一。包括 PHP 在内的开源生态的标准库中使用联合类型非常普遍,PHP 支持联合类型,将会允许将更多类型信息从 phpdoc 迁移至函数签名。可以说,泛型之后,联合类型是目前类型声明系统中最大的突破口。
Attributes,注解
这里的 Attributes 也就是其它语言中的 annotations(注解),它提供了一种向类添加元数据的方法,无需解析文档块。
新的 static 返回类型
虽然已经可以返回 self,但是考虑到 PHP 具有动态类型的性质,PHP 8 中支持 static 返回类型将更加高效,对于许多开发者来说应当非常有用。
class Foo
{
public function test(): static
{
return new static();
}
}
WeakMap,弱映射
WeakMaps 允许创建从对象到任意值的映射(类似 SplObjectStorage),而不会阻止对用作 key 的对象进行垃圾回收。只要将对象添加到 WeakMap 中,GC 在触发条件时就可以将其占用内存回收。
PHP 7.4 中,实际上已经引入了对 WeakReference(弱引用)的支持。但是,原始的弱引用本身用途有限,而弱映射在实践中更为常用。由于没有提供注册销毁回调的功能,因此无法在 PHP 弱引用之上实现有效的弱映射。弱映射的一般用例是将数据与单个对象实例相关联,而不强迫它们保持活动状态,避免长时间运行的进程无谓地占用内存。
class Foo
{
private WeakMap $cache;
public function getSomethingWithCaching(object $obj): object
{
return $this->cache[$obj]
??= $this->computeSomethingExpensive($obj);
}
}
关于 WeakMap/WeakReference,可以参考这一篇的 WeakRef 部分,虽然讲的是 JS,但原理是相通的:
https://www.oschina.net/news/106670/what-s-new-in-javascript-google-io-2019
更多的相关特性可以查看:
- https://www.php.net/index.php#id2020-06-25-1
- https://wiki.php.net/rfc
- https://github.com/php/php-src/blob/master/UPGRADING
- https://derickrethans.nl/archive.html(Derick Rethans 的博客,他是 PHP 核心贡献者,也是 PHP 7.4 的 release manager)
此外还注意到几个处于投票阶段的特性(也就是可能比较快会并入某个版本中的),像 match expression(匹配表达式)与使用 @@ 或 #[] 替代 <<>> 的提案都是比较值得关注的:
需要注意的是,PHP 8 是一个重大更新版本,带了一些重大变更,所以最好查看 UPGRADING 文档的相关事项。不过实际上,其中许多重大变更在之前的 7.* 版本中已经引入,因此,如果你一直保持最新版本,那么升级到 PHP 8 也影响不大。
另外,PHP 8 中 JIT 主要贡献者鸟哥 @Laruence 在此版本发布前也发表了相关文章,讲述 JIT 的研发历程,感兴趣可以瞧瞧:写在PHP8发布之前的话。
如果是做算法的话,多线程和多进程肯定是重点了。 但是一般有这些需求的,都会选更成熟的 java 或者 go c++ 了
单纯的数值型计算,耗时对比大概是这样:
GCC(-O2优化) : V8 : PHP8 : PHP7 = 1 : 9 : 90 : 110
但是一旦涉及到字符串连接和哈希表等操作,V8的性能会明显下降,这时PHP会体现出明显的性能优势.
我觉得字符串连接和哈希表对比测试数据可以贴上。
node.js 14 用了新版的v8,又有些性能提升了......
可以测测 node.js14 和 php7.4 的数据
还是说你从来没有写过PHP CLI命令行程序?
还是说你认为Swoole/WorkerMan/ReactPHP/AMP这些事件驱动内存常驻的PHP CLI服务都是玩具?
PHP-FPM有PHP-FPM的应用场景.
需要做出改变的不是PHP-FPM,而是你自己.
配合PHP的require,在CLI这种内存常驻的模式下,也能实现局部代码的热修改.
开发者就算你有协程也是开发效率低下,并发在业务中没那么重要??
Facebook ?淘宝?做个聊天软件看看并发试试?撇开场景就尬吹?
如果官方考虑上协程,估计还得5年,到时候 java 正好发布 26 , node 发布 24.0 ,golang 4 可能都出来了.......又有新特性跟不上了。
就怕落后,还跑得慢~
不过从淘宝,FB相继换掉php后,目前上市公司中使用 node.js 的案例确实是多于 php....
目前openjs 基金会有谷歌,苹果,微软,IBM,paypal 大多都白金会员,你这都能叫没人要的话,那php岂不是.....
paypal 用 node 替换了 java , 国内阿里用 node 替换了 php (如果这也叫前端的话,那php也是前端) 。别用自己的无知当资本。
但是纯php-fpm 的大公司,没有。目前就国内有 勉强有 swoole 和 yaf 大厂的应用了,php-fpm 都见不着了。你这酸什么?
node.js 为主或者占有业务领域的有: NASA,雅虎,领英。
node.js 占一部分的就不说了,比如阿里....
真酸....
主要问题还是封装太少,轻量级的。
并且安装麻烦,如果有框架BUG,你得排C 的BUG 了.....
所以目前用的人很少....
顺便 提一句,java EE已经给了 eclipse 基金会。
除了oracle 的JDK 实现,oracle 德行就那样,除了收费的oracle JDK 还有 oracle 家免费的 openjdk(半年支持)。目前阿里,亚马逊,redhat,adopt 自己华为自己的实现... 除了华为没有开放,其他家都可以免费下载使用。
而 js 目前也有谷歌,微软和firefox 的引擎。
顺便提一下,zend 先是卖给 rogue wave ,随后被 perforce 收购了,收购后不久,php 联合创始人 ZS 就离职了...
另外,php 联合创始人 ZS 自己都走了,你觉得说这很有意思?
顺便提一句, P 站 除了 php还有 node.js 和 go 。而且其中 webRTC 部分,不可能是php .....
linux 基金会每年收入超过8000万美金,都白嫖的。
我看这些年不是有很多倒闭的语言么,比如发展不太好的lua,还有一些国内的什么木兰语言,咱们把这些语言集合起来,反正倒闭了不是么,前面咱们加一层负载均衡,保证每个语言分到的钱差不多。把这些语言都给他盘活了,这么多语言,每年不收个几百亿美金啊,名字我都想好了: 分布式基金会。
我现在懂了,我这就呼吁前端别用 js ,回头咱们一起写个 php转 wasm 的,干翻web ,顺便还生成个桌面应用,替代electron 。node.js 那套工具链,不攻自破了。看它还能咋。
到时候 paypal ,Netflix , uber 不得求着咱们放过node.js .....狠狠敲诈它们一笔,美国资本真可气
哦,我的上帝啊,他可真没良心,我真该觉得阿里应该用 php 替换掉 java ,毕竟php 也是后端语言。
阿里没用 php 做中台,是因为php不是前端,也没用它做后台,肯定因为php 不是后端。我懂了,我发现个惊天的秘密,一定因为 php 是全栈,所以阿里才前后端都不用。那这牛逼了,太厉害了这。我得学php,谁也别拦我,这老牛逼了....
就是不愿意再碰,所以你看 RY 2012年离开后,这没几年就回来开发 php 了,项目名叫什么 deno 。嗯,用 php 干掉 node 的意思。
我建议 php 申请专利,别让 ry 用。
ry 在我心中一直是伟大的神,16年就通过意念写代码,解决了 node.js 开发组多年没解决的回调问题。18年更是通过意念解决了 npm 层级问题。
2020年,我觉得 ry 肯定会通过意念再解决 node-gyp 问题,一键迁移到cmakejs
这帮渣渣改什么核心代码,核心就一个 v8 ,其他都是node 带的模块,哪有核心代码,这帮人移植都不会,是真的菜。
毕竟世界上只有 ry 一个人会写 node.js 。
这帮渣渣,等 ry 大神用 rust 实现一个 支持 ts 的 v8 ,还不被打的满地找牙?
秀儿:你创始人都跑了!
JS基金会:我们已经8年没更新了,我们还是聊别的吧。
秀儿:你创始人都说node 垃圾。
paypal : 我们系统天天崩,我们还是聊别的吧。
秀儿:ts 也是垃圾。
微软:我都穷的揭不开锅了,就ts 能勉强维持的得了生活这样子,我们还是聊点别的吧。
秀儿: php....
群众: 是世界上最好的语言!
@buexplain @水木易安
从他们 java 换到 node 的操作上,就能深刻感受到,这家公司的技术的愚蠢。愚蠢至极。跟国内外包公司岂止差了一个等级,就应该外包给国内来做才对嘛。还有那个微软,自从开发了ts 后,windows 就BUG 不断,内部团队就是个渣渣,用 C#生成js 不香吗? 非要把 C#之父搞过去,弄ts ,简直是临阵脱逃,耻辱。 还用 ts 写 vscode ,太蠢了,用什么ts ,直接二进制手撸它不香吗?织席贩履之辈,欺世盗名之徒~~吾从未见过W软这样厚颜无耻之徒~
不管怎样,js 总会有自己的办法,在新领域分一杯羹。
对于一些富有朝气的语言,也总有开发者把他带到新领域。
而....廉颇老矣,尚能饭否?
jvm .netcore v8 每年的投入,比 php 团队10年还多。站在巨人肩膀上,省很多事,比如 JIT 。