修复 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 处理器。
步骤
- 等 GA,再等你的主机商或发行版提供新分支。
- 检查你的 CMS。WordPress 手册显示,PHP 8.5 的支持是在 WordPress 6.9 加入的。GA 之后,去手册里查 8.6 和你所用的 WordPress 版本。
- 在 staging 上扫描。PHP 8.2 升级到 8.4 里有 PHPCompatibility 的命令。等你手上的 PHPCompatibility 认识目标版本后,把
testVersion设成它。 - 只在 staging 上测试。永远不要把候选版本放到生产环境。现在用 8.4 修复 PHP2Shell,8.6 当作单独的项目来做。
最后审阅:2026年10月22日