2026 年 11 月 12 日,PHP 官网新闻归档挂出 PHP 8.6.0RC7 available for testing:PHP 8.6.0 RC7 已提供源码包与 Windows 预发布二进制,供社区做 GA 前最后一轮测试。按公告口径,下一个版本就是首个正式版 PHP 8.6.0,计划 11 月 19 日发布——距今只剩 6 天,GA 日期并没有因为多出来的候选版而顺延。

本站 11 月 7 日发过一篇 《PHP 8.6.0 RC5 发布:收官候选版修了什么,GA 定档 11 月 19 日》,当时依据的是 11 月 5 日公告里「下一个版本将是 GA」的表述。一周过去,官方在 GA 前又追加了 RC6 与 RC7 两个测试版,其中 RC6 并没有单独的新闻公告。这篇跟进把变化讲清楚:为什么临时加版、两份 NEWS 改了什么、ABI 变更对扩展维护者意味着什么,以及这一周该把测试跑到哪一步。信息取自 php.net 新闻归档、官方邮件列表公告、php-8.6.0RC7 标签的 NEWS 与发布周期 Wiki。

官网公告要点

The PHP team is pleased to announce the fifth release candidate of PHP 8.6.0, RC7.
The next release will be the first GA release, PHP 8.6.0, planned for 19 November 2026.
Please DO NOT use this version in production, it is an early test version.
—— php.net,12 Nov 2026
项目内容
版本PHP 8.6.0 RC7(公告原文称 the fifth release candidate)
公告日期2026 年 11 月 12 日(php.internals 邮件 14:26 UTC 同步发出)
源码下载https://downloads.php.net/~svpernova09/,git tag 为 php-8.6.0RC7
Windows 二进制https://www.php.net/pre-release-builds.php#windows
问题反馈php-src 的 GitHub Issues(bug_report.yml 模板)
签名校验release manifest 或预发布构建页,邮件正文同时给出三个源码包的 SHA256 与 PGP 签名
变更资料RC7 标签的 NEWS 与 UPGRADING(源码包内也有一份)
下一版本首个 GA 正式版 PHP 8.6.0,计划 2026 年 11 月 19 日
⚠️
仍然不要上生产
官方原文加粗重申 Please DO NOT use this version in production。RC7 只用于兼容性测试、扩展回归和 CI 试跑,生产部署请等 11 月 19 日的 GA。

一个容易看懵的细节:RC7 为什么叫「第五个」候选版

公告原文写的是 the fifth release candidate of PHP 8.6.0, RC7,而 11 月 5 日的 RC5 公告写的是 the fourth release candidate。编号与计数对不上,原因要连起来看:按发布周期 Wiki,9 月 24 日的 RC1 因打包失误被跳过,实际候选版从 RC2 开始;而 11 月 12 日同日打了 RC6 与 RC7 两个 tag,php.net 新闻归档里 只有 RC5 和 RC7 两条公告,RC6 没有独立公告。所以别用编号去推算「第几个 RC」,公告里的序数按官方原文照录即可。

跟进重点:说好的「收官」,为什么又多了两轮 RC

PHP 8.6 收尾时间线(2026 年 11 月)
11/05 RC5 公告:下一个版本就是 GA,定档 11/19
↓
11/09 发布经理宣布:GA 前追加一个候选版(ABI 原因)
↓
11/12 NEWS 同日出现 RC6 与 RC7 两段;官网只公告 RC7
↓
11/19 首个 GA 正式版 PHP 8.6.0(计划,未变)

起因不是又发现了大批量 bug,而是 二进制兼容。发布经理 Matteo Beccati 在 11 月 9 日发给 php.internals 的说明里讲得很直接:

The php2shell fix introduced an ABI incompatibility in PHP 8.6, but not in older versions, which is why it was missed. Per our release policy, the API version number therefore needs to be bumped, requiring extensions to be rebuilt.
—— Matteo Beccati,php.internals,2026-11-09

也就是说:php2shell 的修复在 8.6 分支引入了 ABI 不兼容(旧版本不受影响,所以早先没被发现),按发布政策必须提升 API version,所有扩展都要重新编译。发布经理因此决定在 GA 前额外插入一个候选版,顺便 cherry-pick 几处修复——这就是 RC6;随后同日又打了一个 RC7 收尾。官方还提到,PHP 8.5 也有过「GA 前一周临时加 RC」的先例,这次沿用同一做法。

💡 小技巧:Wiki 的 8.6 时间表 目前仍只列到 11/05 RC5 → 11/19 GA,尚未补上 RC6/RC7。判断实际发布了哪些版本,以 php.net 新闻归档 与 NEWS 标签为准,别只抄计划表。

RC6 与 RC7 到底修了什么

php-8.6.0RC7 的 NEWS 里,11 月 12 日有两段并列记录。RC7 本体只有 2 条修复,RC6 有 5 条,全部是 Fixed,没有任何新增特性——特性早在 Beta1 就冻结了。

版本 / 模块修复内容(NEWS 要点)谁要留意
RC7 · Core修复 array_map() 优化未解析一等可调用体(FCC)函数名的问题(ChrisAbner)。此前 RC4 已修过同一优化里静态 FCC 类名的问题8.6 把 array_map() 编译为 foreach 的优化路径,尤其是传 first-class callable 的写法
RC7 · OpenSSL修复 TLS server ALPN 与 Windows 证书检查中的释放后使用(UAF):传给 stream_socket_enable_crypto() 的会话流在握手完成前被关闭时触发(Ilia Alshanetsky)TLS 服务端、加密流、连接提前关闭的异常路径
RC6 · Core给 globals 增加 padding,避免后续补丁版本新增字段时引发潜在 ABI 不兼容(ilutov)扩展二进制兼容、8.6 后续补丁版
RC6 · Datetimelib 升级到 2026.03(Derick)时区数据、日期解析与格式化
RC6 · Fileinfo修复 GH-25051:libmagic 5.48 起 TrueType 字体被误判为 application/octet-stream;同时修正 HWPX 文件的 MIME 识别(Weilin Du)上传类型校验、依赖 finfo 判定文件类型的业务
RC6 · Streams修复请求启动阶段出现流错误时(例如 POST body 无法缓冲到临时文件),上一请求默认流上下文被释放后使用的问题(Go Kudo)FPM / 长驻进程、大请求体上传
⚠️ 注意:别因为「RC7 只有两条」就跳过这轮回归。一条踩在 8.6 新增的 array_map() 编译优化上,一条是 TLS 路径的内存安全修复,加上 RC6 的 ABI padding,恰好都是升级时最容易出问题的位置。

扩展维护者:API 版本变了,二进制必须重建

这是本轮跟进里最容易被忽略、代价却最高的一条。API version 因 ABI 变化被提升后,凡是针对 RC5(或更早的 8.6 预发布版、乃至 8.5 分支)编译出来的 .so / .dll 都不应直接拿来配 RC7 或 GA 使用。维护 PECL 扩展、自研 C 扩展、或使用预编译扩展包的团队,现在就该用 RC7 重新构建一次,而不是等到 11 月 19 日 GA 当天。

bash 扩展重建前核对 API 版本
# 1) 确认构建工具链对应的 PHP API 版本
phpize -v
php -i | grep "PHP API"

# 2) 用 RC7 的 phpize / php-config 重建扩展(路径替换为实际安装位置)
/path/to/php-8.6.0RC7/bin/phpize
./configure --with-php-config=/path/to/php-8.6.0RC7/bin/php-config
make && make install

# 3) 加载后确认扩展正常,并跑一遍自身测试
php -m | grep your_extension
make test TESTS=tests/
ℹ️
Windows 用户
官方预发布构建页提供 RC7 的 Windows 二进制,但自编译扩展同样要按新的 API 版本重新构建;直接复用旧 DLL 可能加载失败或出现难以定位的崩溃。

GA 倒计时 6 天:这一周该做什么

离 11 月 19 日的计划 GA 只剩不到一周,官方把测试窗口压得很紧。建议按角色把动作拆开:

角色建议动作
业务应用开发者把 RC7 加进 CI 的「允许失败」任务,跑全量测试并收集 E_DEPRECATED;重点回归上传文件类型判断、TLS 加密流与 array_map() 相关断言
框架 / 库维护者针对 RC6 的 Fileinfo、Streams 修复补回归用例;确认依赖的扩展包已有新 API 版本构建
PECL / C 扩展维护者用 RC7 重新编译并发布对应构建,检查 phpize -v 报出的 API 版本是否一致
运维 / 升级决策者暂不排死生产切换窗口:升级排期以 11/19 GA 为目标,但保留一次候选版追加的缓冲,并持续盯官网新闻归档

下载源码包后先核对摘要。官方邮件给出的三个 SHA256 如下:

bash php-8.6.0RC7 源码包校验
# 以 tar.xz 为例,期望值:
# 63dba3b693d2f2689f12d5264d212d7b813acfd56fb375c620d04e1eef4bb00a
sha256sum php-8.6.0RC7.tar.xz

# 其它两个包(官方邮件原文)
# php-8.6.0RC7.tar.bz2  c3461997f9ad49935e550867f03e6aa13ad589f6ed360bb39a4ae752d482c7cd
# php-8.6.0RC7.tar.gz   68b753e1d45e1417c6874008500de66102963cf0791e8c541211e9386318722e

官方资料入口:

ℹ️
和前文连起来看
8.6 的新特性速览、Session 三个默认值变化、E_DEPRECATED 弃用清单与升级动作顺序,已在 RC5 那篇 详细展开,本文不重复。RC7 没有引入新的升级注意项,升级前的兼容性准备仍以前文清单为准。

对前文的一处更新

本站 RC5 一文把 RC5 称为「收官候选版」,这在 11 月 5 日的官方公告口径下是准确的;按 11 月 12 日的最新公告,GA 前的最后一个测试版已经变成 RC7,需要据此更新结论。不过有一点值得留个心眼:RC5 公告同样写过「下一个版本就是 GA」,随后仍追加了两轮 RC。因此更稳妥的做法是——GA 日期 11 月 19 日照常作为排期目标,但生产切换窗口等正式版真正落地再锁定,期间以官网新闻归档为唯一准绳。

总结

PHP 8.6.0 RC7 不是一次功能更新,而是 8.6 周期被 ABI 变更「拽回来」多跑的两轮收尾验证:RC6 处理 ABI padding、timelib、Fileinfo 与流上下文,RC7 收敛 array_map() 优化与 TLS 路径的 UAF,GA 仍定档 11 月 19 日。对多数业务开发者,这周最划算的动作是把 RC7 放进 CI 跑一遍;对扩展维护者,则是立刻按新 API 版本重新编译。别把 RC 当正式版,也别把「下一个就是 GA」当成不可变承诺。

候选版可以临时追加,正式版的兼容性没有第二次机会。