2026-11-11t23:26:48z,github php/php-src 的 releases atom feed 新增条目 php-8.6.0rc7,条目正文只有一行「tag for php-8.6.0rc7」。这距 rc5 的 tag(11-05)过去六天,距 rc6 的 tag(11-10 18:15z)还不到一天。仓库的 git/refs/tags/php-8.6.0rc7 返回一个带 pgp 签名的附注 tag 对象,tagger 为 8.6 新任发布管理员(rookie rm)joe ferguson

▲ php-8.6.0RC7 发布页
计划表只排到 RC5,RC6/RC7 是计划允许的补排
wiki.php.net 的 PHP 8.6 Preparation Tasks 页给出的时间表到 RC5 就直接跳到 11-19 GA,并没有预排 RC6 及之后的候选版本。不过同一页写得很清楚:「Individual releases may be added or removed to accommodate development progress」,并且沿用「Tag on Tuesday, release on Thursday」的节奏——RC6 正是在周二(11-10)打的 tag,RC7 的补排属于计划明确允许的动作。此外,对照 GitHub Releases REST API 可以确认:仓库 15 条正式 release 的最新一批仍是 2026-10-21(8.5.15/8.4.27/8.3.29/8.2.30 安全修复批次),RC7 在 GitHub 上只是一个 tag 条目加自动生成的源码包,不是正式 release。时间表中的 11-19 GA 是计划日期而非已发生的事实,本条信息不能外推出 GA 推迟或提前的结论。

▲ wiki.php.net 8.6 发布计划页
RC6 到 RC7:又 cherry-pick 了两个修复
用官方 compare 接口对比 php-8.6.0RC6 与 php-8.6.0RC7 两个 tag,中间只有 5 个提交:分支版本号回归 dev、一条 NEWS 更新,以及两个实质修复——都是为 GA 质量收尾而 cherry-pick 进分支的。从 RC5 到 RC7 的更大范围看,这段时间合入的还有 fileinfo 的 TrueType 字体 MIME 识别恢复(GH-25051)与 HWPX 误判 OOXML 的修复(GH-25105)、默认流上下文在 stream 错误码路径上的释放后使用(#25321)、timelib 升级到 2026.03,以及为保证补丁分支 ABI 兼容而做的 globals 填充与 API 版本号递增。
第一个修复针对 ext/openssl:共享 SSL_CTX 的回调读取已释放的 session stream。提交 33e562e140 的说明写明:自 b1242c32bca 起,由 session stream 派生的服务端流共享父流的 SSL_CTX,而 ALPN 选择回调与 Windows 无 CA 文件时的证书校验回调都以父流指针注册为参数——父流若在子流握手完成前被关闭,这两个回调就会读到已释放内存,子流还会静默协商不出 ALPN 协议。修复改为像 verify_callback 与 SNI 回调那样从 SSL ex_data 反查握手自己的流,并给子流复制一份 ALPN 协议列表:
ext/openssl/xp_ssl.c
@@ -785,7 +785,8 @@ static int php_openssl_win_cert_verify_callback(X509_STORE_CTX *x509_store_ctx,
bool is_self_signed = false;
- stream = (php_stream*)arg;
+ SSL *ssl = X509_STORE_CTX_get_ex_data(x509_store_ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
+ stream = (php_stream*)SSL_get_ex_data(ssl, php_openssl_get_ssl_stream_data_index());
sslsock = (php_openssl_netstream_data_t*)stream->abstract;
@@ -1649,7 +1650,10 @@ static int php_openssl_server_alpn_callback(SSL *ssl_handle,
const unsigned char **out, unsigned char *outlen,
const unsigned char *in, unsigned int inlen, void *arg) /* {{{ */
{
- php_openssl_netstream_data_t *sslsock = arg;
+ php_stream *stream = (php_stream *)SSL_get_ex_data(ssl_handle, php_openssl_get_ssl_stream_data_index());
+ php_openssl_netstream_data_t *sslsock = (php_openssl_netstream_data_t *)stream->abstract;
+
+ ZEND_ASSERT(sslsock->alpn_ctx.data != NULL);
@@ -2800,6 +2804,16 @@ static zend_result php_openssl_setup_crypto(php_stream *stream,
} else {
SSL_CTX_up_ref(parent_sslsock->ctx);
sslsock->ctx = parent_sslsock->ctx;
+#ifdef HAVE_TLS_ALPN
+ if (parent_sslsock->alpn_ctx.data) {
+ if (sslsock->alpn_ctx.data) {
+ pefree(sslsock->alpn_ctx.data, php_stream_is_persistent(stream));
+ }
+ sslsock->alpn_ctx.data = (unsigned char *) pestrndup((const char *) parent_sslsock->alpn_ctx.data,
+ parent_sslsock->alpn_ctx.len, php_stream_is_persistent(stream));
+ sslsock->alpn_ctx.len = parent_sslsock->alpn_ctx.len;
+ }
+#endif
▲ 补丁片段摘自上述提交
第二个修复在 Zend 编译器:array_map() 展开优化不解析 first-class callable(FCC)的函数名(提交 9a482311c0,cherry-pick 自 master 的 365d450ba)。旧逻辑把回调的函数名当普通表达式先编译求值,得到的是未经命名空间解析的字符串常量,绕过了 use function 导入与运行时的全局函数回退;修复对「字面量函数名」这一情形改回按普通调用编译,不做缓存展开:
Zend/zend_compile.c
@@ -5399,9 +5399,19 @@ static zend_result zend_compile_func_array_map(znode *result, zend_ast_list *arg
/* Evaluate function name */
znode func_node;
- {
+ zend_ast *func_name_ast = callback->child[callback->kind == ZEND_AST_CALL ? 0 : 1];
+ if (callback->kind == ZEND_AST_CALL
+ && func_name_ast->kind == ZEND_AST_ZVAL
+ && Z_TYPE_P(zend_ast_get_zval(func_name_ast)) == IS_STRING) {
+ /* A literal function name has no side effects and must not be memoized:
+ * compiling it as an expression would yield the unresolved string, which
+ * ignores the current namespace, "use function" imports and the runtime
+ * fallback to the global function. Compile the call in the loop body with
+ * the original name instead, like a regular call. */
+ func_node.op_type = IS_UNUSED;
+ } else {
znode result;
- zend_compile_expr(&result, callback->child[callback->kind == ZEND_AST_CALL ? 0 : 1]);
+ zend_compile_expr(&result, func_name_ast);
▲ 补丁片段摘自上述提交

▲ php-src 修复提交
Windows QA 构建已就位,仅用于兼容性预检
php.net 预发布构建页的 Windows Builds 区本次为 8.6.0RC7 列出的构建全部标注 12 Nov 2026 并附 sha256:源码包(34.59MB)、测试包 phpt(19.53MB)、VS18 x64/x86 的 Thread Safe 与 Non Thread Safe Zip(33.18–37.89MB)、各自的 Debug Pack(51.58–54.08MB)与扩展开发 SDK 包(1.71MB)。页面右侧「Test Releases」一栏的措辞没有变:这些构建不是给生产环境运行的,只用于测试,遇到问题应到 GitHub Issues 报告。值得注意的是该页的 QA Releases API(pre-release-builds.php?format=json)也可以程序化拉取这份清单,便于 CI 跟踪后续 RC 与 GA。

▲ php.net 预发布构建页
对使用者的实际含义是:8.6 正式版临近(计划 GA 为 11-19,属计划日期),现在是用 RC 源码做兼容性预检的窗口——用 RC 源码包在 CI 里编译自有扩展、跑测试套件验证回归、核对 API/ABI 版本变化,都应在这个阶段完成,而 RC 本身不要部署到生产。等 php.net 发布 RC7 正式新闻后,可以回到新闻归档页核对发布说明;若关注 GA 进度,观察点是 RC7 之后的正式公告与 wiki 时间表的对应关系,而不是把 RC 的补排解读为延期信号。
关键信息
| 项目 | 内容 |
|---|---|
| 类目 | 版本更新 |
| 级别 | 中 |
| 日期 | tag 2026-11-11T23:26:48Z;Windows 构建标注 12 Nov 2026 |
| 关联编号 | PHP 8.6.0 RC7 / tag php-8.6.0RC7 |
| tag 对象 | 附注 tag,PGP 签名(GitHub Verified),tagger Joe Ferguson |
| RC6→RC7 修复 | ext/openssl 共享 SSL_CTX 回调读已释放 session stream(33e562e140,GH-25211);array_map() 优化不解析 FCC 函数名(9a482311c0) |
| 影响范围 | 8.6 预发布测试构建;不可用于生产 |
| 公告状态 | php.net 新闻/首页/Source Builds 区仍为 RC5(11-05);正式公告待发 |
| GA 计划 | wiki.php.net 时间表标注 2026-11-19(计划日期,非已发生) |
| 核验状态 | 双源交叉核实(GitHub php/php-src / php.net 预发布构建页) |
来源:https://github.com/php/php-src/releases/tag/php-8.6.0RC7
让 Windows 桌面程序在开机时静默自启并隐藏到系统托盘。特别适用于 Flutter、Electron 等无视 VBS/ProcessStartInfo 窗口样式、难以隐藏的顽固应用。提供「VBS 启动器 + Python ctypes/Win32 API」的隐藏窗口方案,可稳定把窗口收进托盘且不闪控制台。
来源:https://www.php.net/pre-release-builds.php
来源:https://wiki.php.net/todo/php86
来源:https://github.com/php/php-src/commit/33e562e1404cd1d141931e44bb15d14a9e9b2eba
来源:https://github.com/php/php-src/commit/9a482311c094861fd7dffee26bab6e0e4c55fe2b
来源:https://github.com/php/php-src/compare/php-8.6.0RC6...php-8.6.0RC7
来源:https://www.php.net/feed.atom
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










