编程 PHP 8.6.0 RC3 修回的几处自伤回归:fiber 静音、hrtime 偏快、HEAD 请求漏 fd

2026-10-14 21:03:44

PHP 8.6.0 RC3 修回的几处自伤回归:fiber 静音、hrtime 偏快、HEAD 请求漏 fd

PHP 8.6.0 RC3 于 2026-10-08 发布。RC 阶段只合入 bug 修复,这一批里相当一部分是修回 8.6 自己引入的回归——也就是说,如果你在 beta/RC 上跑过测试,有几个坑是这版刚从土里刨出来的。GA 定在 2026-11-19,中间还有 10-22 RC4、11-05 RC5。

Fibers 不再把 warning 吞掉

8.6 此前在没有 php.ini 设置时,fiber 启动后会把 error_reporting 设成 0。结果就是 fiber 内部的所有 warning 被静默,什么都不打印。

RC3 恢复了正确行为:fiber 不再以 error_reporting=0 启动。如果你在 fiber 之上跑的运行时(Swoole、Revolt 之类)里一直看不到 warning,升级 RC3 后它们会重新冒出来。

hrtime() 回到 CLOCK_MONOTONIC

8.6 此前把 POSIX 高精度计时器切到了 CLOCK_MONOTONIC_RAW,在某些机器上让 hrtime() 快了约 4%,也就是计时结果偏快。另一个问题是可移植性:内核自 Linux 5.3 起才通过 vDSO 提供 CLOCK_MONOTONIC_RAW,在 RHEL 8 这类较老系统上,每次调用都退化成一次 syscall。

RC3 改回 CLOCK_MONOTONIC,与 8.5 保持一致。若你在 betas 上做过基于 hrtime() 的 benchmark,数据需要重跑。

strict_types 下关掉 array_map() 的快速路径

8.6 对部分 array_map() 调用改用了更快的编译路径。但在 strict_types=1 的文件里,新路径会对回调参数做类型检查,而 array_map() 以前从不做这件事,行为因此改变。

RC3 对 strict_types=1 文件关闭了该快速路径,使行为回到 8.5;同时对非字面量函数或非字面量参数的调用一并做了修复。

OPcache 不再把 $cond ? -0.0 : 0.0 折叠成 -0.0

开启 OPcache 时,优化器会把 $cond ? -0.0 : 0.0 折叠成单纯的 -0.0,条件被整个丢掉。

对依赖零的符号的代码,这会直接改变结果:1.0 / $zero 得到 INF 还是 -INF 取决于 OPcache 开没开。这类 bug 特别难发现,因为开发环境通常不开 OPcache,而生产几乎总是开着。RC3 修掉。

内置 web server 每次 HEAD 请求泄漏一个文件描述符

php -S(内置 web server)在处理静态文件时,每个 HEAD 请求都会泄漏一个文件描述符(GH-23764)。报告者是靠一个每 40 秒探测一次 php -S 的监控探针发现的,按这个频率大约 11 小时就会把描述符耗尽。

该 bug 可以追溯到 PHP 8.2。RC3 顺带还修了两处:客户端在服务器接受连接前重置连接时的崩溃,以及部分 socket 写之后错误页被截断的问题。

PDO 与 OpenSSL 等修复

  • PDOStatement::execute() 执行失败后,不再遗留上一次的结果;
  • setFetchMode() 一次应用所有改动;
  • 绑定参数的 __toString() 导致的 use-after-free 已修;
  • PDO_DBLIB 现在会上报 beginTransaction() / commit() / rollBack() / lastInsertId() 的错误,而不是吞掉;
  • openssl_sign() 对 RSA-PSS 签名改用 OpenSSL 默认 salt 长度,而非最大长度。若你用固定 salt 长度验证签名,需要针对 RC3 测试。

新弃用(UPGRADING)

用 let 或 is 作为类 / 函数 / 常量名,用 _ 作为常量名或 use 别名,均已弃用。这些不是 RC3 新增的,RC2 就已经包含。

RC3 changelog 共 69 条,跨 19 个组件。

不要在生产环境跑 RC 版本。问题反馈到上游 GitHub Issues。版本页:,QA 构建:。

复制全文 生成海报 PHP 版本更新 回归 OPcache 发布说明

推荐文章

程序员茄子在线接单