PHP 8.6:发布日期,以及迁移前要检查什么

PHP 8.6 计划在 2026 年 11 月 19 日正式发布,目前是 RC4。这里整理发布计划、已确认的变更,以及为什么修复 PHP2Shell 不该等 8.6。

修复 PHP2Shell 不要等 8.6

PHP 8.6 还没有发布。它最新的构建是候选版本(RC),PHP 项目明确说这类构建只用于测试,不能用于生产环境。

今天就能安装的修复版本是 8.5.12、8.4.27、8.3.36 和 8.2.35。对大多数站点来说,正确的选择是 8.4。见 选哪个版本。安全公告列出的受影响分支只有 8.2 到 8.5。8.6 的候选版本里有没有 PHP2Shell 的修复,我们没有核实过。也不要为了弄清楚这一点,就把候选版本放到线上站点上跑。

发布日期

PHP 项目在 wiki.php.net 上的 8.6 发布页面(最后编辑于 2026 年 10 月 21 日)写的是 2026 年 11 月 19 日正式发布(GA)。这和我们记录的日期一致。这只是计划日期,以 php.net 上的发布公告为准。

日期里程碑2026 年 10 月 22 日的状态
2026 年 7 月 2 日到 7 月 30 日Alpha 1 到 3已发布
2026 年 8 月 13 日到 9 月 10 日Beta 1 到 3已发布
2026 年 9 月 22 日硬性功能冻结已过
2026 年 9 月 24 日RC2(跳过了 RC1)已发布
2026 年 10 月 8 日RC3已发布
2026 年 10 月 21 日RC4已发布
2026 年 11 月 5 日RC5计划中
2026 年 11 月 19 日GA计划中

按 Wiki 的说法,软性功能冻结从 8 月 13 日的 Beta 1 开始,硬性冻结在 9 月 22 日,之后新功能需要发布经理批准。所以功能集基本已经定了。php.net 的预发布页面列出了 8.6.0RC4,日期为 2026 年 10 月 21 日。

8.6 的支持日期还没有公布。PHP 项目的受支持版本页面上还没有 8.6。项目公开的政策是两年活跃支持,之后再提供两年只含安全修复的支持。在项目公布具体日期之前,我们不写 8.6 的日期。

已确认的内容

Wiki 的 RFC 索引在 PHP 8.6 的 “Implemented” 下列出了以下各项。这里只是一部分。

  • 部分函数应用(Partial function application)。
  • readonly 属性的默认值。
  • clamp() 函数。
  • Duration 类。
  • 轮询(polling)API。
  • 流错误处理的改进。
  • SortDirection 枚举。
  • 类常量上可以使用 #[\Override]。
  • 可调试的枚举。
  • 更安全的 session 默认配置。
  • trim() 系列函数加入换页符(form feed)。
  • 不再支持 mbregex,因为 Oniguruma 已经没人维护。
  • 废弃从 __construct() 和 __destruct() 返回值。

只处于提议或讨论阶段的内容,我们一律不列。RFC 索引还显示一个已接受的 RFC,“Minimum supported versions for PHP 8.6”。它的正文我们没有读过。

迁移前要检查什么

以下变更来自 php-src PHP-8.6 分支里的 UPGRADING 文件。分支上的文件在 GA 之前仍可能变动,正式发布时请再核对一次。

可能让站点出问题的行为变更

  • Session 默认值变了: session.use_strict_mode=1、session.cookie_httponly=1 和 session.cookie_samesite="Lax"。测试登录、购物车,以及所有跨站点的流程,比如支付完成后的跳转和单点登录。
  • trim()、ltrim() 和 rtrim() 现在默认也会去掉换页符(\f)。
  • 输入检查更严格。 很多函数现在遇到 NUL 字节会报错,包括 getenv()、putenv()、parse_str()、proc_open(),以及 file_exists()、is_file() 这类文件状态函数。找一找把未过滤的用户输入直接传给它们的代码。
  • preg_grep() 遇到 PCRE 错误时返回 false,以前返回的是不完整的数组。
  • 严重的内存耗尽错误现在会调用 abort(),进程以退出码 134 结束。检查那些根据退出码做出反应的监控和进程守护工具。

废弃项

  • 在 finally 里使用 return。
  • 给 define() 传第三个参数。
  • 从 __construct() 和 __destruct() 返回值。
  • 别名 is_double()、is_long()、is_integer() 和 doubleval()。
  • spl_object_hash()。
  • Mbregex。
  • 缺少 create_sid() 和 validateId() 的 session 处理器。

步骤

  1. 等 GA,再等你的主机商或发行版提供新分支。
  2. 检查你的 CMS。WordPress 手册显示,PHP 8.5 的支持是在 WordPress 6.9 加入的。GA 之后,去手册里查 8.6 和你所用的 WordPress 版本。
  3. 在 staging 上扫描。PHP 8.2 升级到 8.4 里有 PHPCompatibility 的命令。等你手上的 PHPCompatibility 认识目标版本后,把 testVersion 设成它。
  4. 只在 staging 上测试。永远不要把候选版本放到生产环境。现在用 8.4 修复 PHP2Shell,8.6 当作单独的项目来做。

最后审阅:2026年10月22日