编程 PHP 8.6 RC3 修掉两个自己引入的回归:fiber 里的 warning 和快 4% 的 hrtime()

2026-10-22 20:03:12

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.51.000083 s1.000086 s
8.6 修复前1.000072 s1.038898 s
8.6 RC31.000158 s1.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

复制全文 生成海报 PHP 版本升级 运维 性能 回归测试

推荐文章

程序员茄子在线接单