PHP 8.6 RC3 修掉两个自己引入的回归:fiber 里的 warning 和快 4% 的 hrtime()
PHP 8.6.0 RC3 于 10 月 8 日发布。由于 RC1 被跳过,这是 8.6 的第二个候选版本。候选版本只带 bug 修复,其中几项修复的正是 8.6 自己引入的回归:它们让 fiber 里的所有 warning 都不再出现,也让 hrtime() 快了约 4%。GA 仍定在 11 月 19 日。
RC3 的变更清单:
- 在没有 php.ini 设置
error_reporting时,Fiber 不再以error_reporting = 0启动 - 计时源切回
CLOCK_MONOTONIC:此前改用 raw clock 后,hrtime()在部分机器上跑快 array_map()的快速编译路径在strict_types=1文件中关闭- OPcache 不再把
$cond ? -0.0 : 0.0折叠成单个-0.0 - 内置 web server 不再在每次 HEAD 请求时泄漏一个文件描述符
- 一长串 PDO、OpenSSL、Intl 与内存安全修复
Fiber 里的 warning 全部消失
在 8.6 的 beta 和 RC2 中,当 error_reporting INI 指令没有值时,新建的 Fiber 会以 error_reporting = 0 启动。PHP 在没有 php.ini 的条件下运行时就处于这种默认状态,官方 Docker 镜像和 php -n 都属于这种情况。结果,fiber 内抛出的每条 warning 和 notice 都不会显示,而 fiber 之外的代码照常报错。
排查时可以先看当前进程的实际取值:
php -n -r 'var_dump(error_reporting());'
在官方镜像里跑同样的命令,也能看到同样的 0。RC3 恢复了原来的行为。
hrtime() 快了 4%:问题出在时钟选择
PHP 8.6 曾把 POSIX 高精度计时器切换到 CLOCK_MONOTONIC_RAW(GH-19221),目的是不让 NTP 的调整进入 hrtime() 的测量结果。NTP 从不校正 raw clock,因此 raw clock 会按硬件实际运行的频率走。Nicolas Grekas 在 WSL2 下测了一次 1 秒 sleep:
| 版本 | microtime() | hrtime() |
|---|---|---|
| 8.5 | 1.000083 s | 1.000086 s |
| 8.6 修复前 | 1.000072 s | 1.038898 s |
| 8.6 RC3 | 1.000158 s | 1.000163 s |
也就是说,hrtime() 大约快了 4%。他还指出,内核从 Linux 5.3 起才通过 vDSO 提供 CLOCK_MONOTONIC_RAW,所以在 RHEL 8 这类旧系统上,每次调用都会退化成一个 syscall。RC3 切回 CLOCK_MONOTONIC,与 8.5 保持一致。如果你在 beta 上用 hrtime() 做过基准测试,需要重新跑一遍。
array_map() 在 strict_types 下的 TypeError
PHP 8.6 会对部分 array_map() 调用采用不同的编译方式,以提升速度。在 strict_types=1 的文件里,这条新路径会对回调参数做类型检查,而 array_map() 以前从不这样做:
declare(strict_types=1);
array_map(trim(...), [1]);
// 8.5: runs fine
// 8.6 RC2: TypeError: trim(): Argument #1 ($string) must be of type string, int given
Tim Düsterhus 在 strict_types=1 文件中关闭了这条快速路径,因此这段代码的行为与 8.5 一致。Arnaud Le Blanc 另外修复了函数参数为非字面量或参数为非字面量的调用。
其余小修
- OPcache 的常量折叠不再把
$cond ? -0.0 : 0.0合并成一个-0.0 - 内置 web server 的 HEAD 请求文件描述符泄漏
- PDO、OpenSSL、Intl 以及内存安全方面的一批修复
现在该做什么
团队明确要求不要在 production 环境跑 RC3。在这个阶段,比较实际的验证方式是:
- 用
php -n和官方 Docker 镜像各跑一遍 fiber 内的 warning、notice 用例 - 凡是之前用
hrtime()测过的基准,全部在 RC3 上重跑,尤其关注 WSL2 和 RHEL 8 这类环境 - 发现问题提交到 GitHub Issues
时间表:
- 10 月 8 日:RC3
- 10 月 22 日:RC4
- 11 月 5 日:RC5
- 11 月 19 日:GA
补充几条上下文:PHP 8.6.0 RC4 实际于 2026 年 10 月 21 日打上 tag(release manager 为 Matteo Beccati)。8.6 分支自 feature freeze 之后只接受 bug 修复,GA 计划在 2026-11-19,最后一个 RC(即 RC5)计划在 2026 年 11 月 5 日。
RC4 包含自 RC3 以来约 50 个修复,同时修掉两个严重漏洞(CVE-2026-109618、CVE-2026-109619),8.6.0 的早期构建受影响,建议所有使用早期构建的人升级。对应分支的补丁版本为 PHP 8.5.12、8.4.27、8.3.36 和 8.2.35。PHP 8.2 将于 2026 年 12 月 31 日结束支持。
来源:https://phpnews.net/php-8-6-rc3 、https://www.php.net/archive/2026.php