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 构建:。