上周五(10月21日),PHP官方一口气放出8.5.12、8.4.27、8.3.36、8.2.35四个安全版本,修掉两条CVSS 4.0评分9.2的未授权RCE(CVE-2026-109618、CVE-2026-109619)。 这个周末,大量站长和运维把洞补了:受支持分支直接升,7.x用回移分支,5.x靠宝塔们的第三方包。到今天(10月30日),社区进入"善后"阶段——而这次补丁最容易被忽略的一点是:它不只是补洞,是把PHP处理内存耗尽(OOM)的longjmp()整个从路径里拿掉了——解释器从上世纪沿用的那套"跳车"机制,被一次性换掉了。知乎

另一个细节是:漏洞爆出后这一周,Google Trends的RisingQueries里,“php version checker”“php2shell checker"这类查询成批冒了出来——“先查自己的PHP版本"一夜之间成了站长们的全民动作。 换句话说,这次换版本改变的不只是"有没有洞”,还有"异常路径上解释器怎么表现”。升级后你的站点"崩溃"的方式,可能和以前不一样。别被新崩法吓到,更别把"站没倒"当成升级验收通过。知乎

一、补丁做的是"架构手术":OOM的表现形式变了,先认出它
两条洞都出在请求收尾机制上。109618的根子在longjmp():内存分配失败时,PHP用长跳直接回请求循环,跳过正常的栈展开和析构;跳转瞬间请求内存如果处于"半初始化"状态,收尾流程就会读到错乱的记账,构造好的multipart请求可以主动耗尽内存触发它——哪怕请求大小完全符合配置限额。109619则是跨请求的状态残留:致命错误打断全局状态重置后,下一个落到同一个worker进程的请求就可能读到已释放内存(use-after-free),官方确认FPM环境下经由session路径的利用可以打到RCE。知乎
而官方GHSA公告里最不寻常的一段在修复方式:补丁把OOM路径上的longjmp()整个移除,换成两层设计——内存超标后先在下一个VM安全点"优雅地"软退出,内存继续涨到第二道更高阈值时直接_exit()硬退出。 这不是打补丁,是换机制:三十年来PHP用跳过收尾换速度,这次官方承认这条路走不通了。知乎
对站点的影响很具体:升级之后,一次OOM触发的不再是"跳回循环继续干活",而是worker退出。Nginx侧可能闪过502,php-fpm日志里"child forced terminated / something killed"这类记录可能变多,个别请求拿到的是连接重置。这不等于你升错了——新机制下退出worker恰恰是"把记账保持干净"的预期行为。崩法变化是特性,不是故障,但你得认识它,不然会花三天去查自己的应用代码。
升级后72小时,盯三个信号:php-fpm的error_log和slowlog里worker退出/强杀记录的新增量、5xx比例在内存高峰时段的变化、有没有同一时段反复死进程。没有,这一节翻篇;有,先对照本节判断是不是正常形态,再决定是否回滚。
二、“修复后性能会变好吗?”——大概率不会,而且这正常
10月29日知乎上有篇讨论值得每个"顺手指望升级涨性能"的人读一遍:安全评分9.2衡量的是风险,不是性能损失,修复和变快不能画等号。分三种情况看:补丁只改了异常路径的,正常请求根本不走那段代码,平均响应时间可以纹丝不动;站点此前被异常请求拖累过的,修复后的"变快"其实是稳定性回血,不是升级红利;如果升级后延迟突然升高,先查实际版本、扩展兼容、配置差异、错误日志,再考虑是不是"安全补丁拖慢了站点"——大部分时候不是。 两个读数也特别容易骗人:CPU占用更低不一定更好(可能是请求根本进不来),吞吐更高也不一定更好(可能是拿延迟换的)。想做前后对比,最低配置是这样:同一组请求集、同一并发量、同一时长,先预热再测(别把冷缓存和进程启动误读成版本差异),跑多轮记录波动范围,不要拿单轮最好成绩宣布"变快了"。而且即使平均响应没变,只要异常进程退出减少、错误率下降,这本身就该记为改善——它们是不同的维度,分开报,别统统写成"性能提升"。知乎
三、兼容性排在"安全"前面:这两天集中冒出来的新问题,比漏洞本身更烦人
升级潮里另一批集中出现的帖子和工单是同一个内容:从7.x切到8.x之后,老业务程序开始不对劲,最高频的是登录直接报错、文件上传挂掉——偏偏这两个还是最不该坏的功能。 给没有CI、没有测试环境的中小团队一套能直接抄的最低动作清单:知乎
切换前:
用phpinfo或面板核对站点"实际运行版本",多版本共存的机器上,`php -v`看到的未必是php-fpm在跑的那个,别靠记忆。
数据和配置各留一份完整备份,跨7.4/8.0/8.1大版本切换尤其如此。
拿不准就先做并存切换而不是原地覆盖:社区分场景处置的共识是——8.x直接升官方修复版;容器里的7.4用回移分支只重编内核、扩展和业务代码不动;宿主机没法上Docker的,把修复版本和旧版并排编译、切模块,出问题秒切回。知乎
小皮面板(phpStudy)自带版本库更新滞后,可以手动从官方下载8.3.36放进面板的PHP目录切换;注意区分NTS/TS——配Nginx用NTS。知乎

切换后:手测核心四件套——登录/注册、表单提交、文件上传、支付回调。四个都对,这次升级才算落地。
还在5.x的用户注意验收口径:10月24日宝塔宣布PHP 5/7/8共14个版本分支都已提供修复包,其中7、8系列走面板直接更新,5.4/5.5/5.6要手动脚本更新、且仍在兼容性测试阶段。 也要把话说白:这类旧版本修复包主要修的是本次已知安全问题,不意味着PHP 5系列重新获得了官方持续安全维护——宝塔自己在公告里就是这么直说的,这类包能买到时间,但买不到长期安全区的门票。知乎小红书
四、把升级这波补完,三类人各算各的账
把这一周的信息合在一起,对照自己属于哪一档:
跑8.2–8.5、已经升完的:补丁这一步完成。接下来72小时盯第一节的三个信号;想确认没退化,用第二节的基线法。8.6已经定档11月19日,但那是下一场账,刚补完洞的现在不是追新版本的时点。
跑7.4及更老、发现"官方压根没发过你的补丁"的:不是幻觉。安全公司Modat在补丁前一天的全网扫描显示:438万个PHP服务、188万台主机里,79%跑在官方已停止维护的分支上,按主机算141万台(75%)至少挂着一个EOL版本;单PHP 7.4就有87万个服务、31.6万台主机,比任何一个受支持分支都多。 cPanel/Plesk早年模板把7.4焊死在共享主机上,Docker官方镜像保留全部历史tag,老项目重建一次就复现一次——这就是"等不到补丁"人群的由来。知乎

第三方回移包先用着,但迁移计划要从"以后再说"排进这个季度——Sansec预测补丁公开后15分钟就可能出现大规模扫描,而这类攻击最爱落的,正是EOL版本的共享主机和电商站。知乎

暂时升不了、先用官方缓解配置顶住的:管理员层面强制memory_limit=-1(写在FPM pool或Apache配置里,不让应用覆盖)、session.upload_progress.enabled=0、8.5再加fatal_error_backtraces=0,改完重启所有worker。 两个代价要知情:关掉upload_progress会失去上传进度条功能;memory_limit=-1后,兜底的正是第一节说的新OOM机制——worker按预期退出,502形态会随之变化。也别把缓解当成修好——官方口径里这些临时措施只是争取时间、并不等于彻底修复,而且日志里没记录也不等于环境安全。知乎知乎
这轮事件最贵的功课,不是那条9.2分的漏洞,而是补丁顺手改写的解释器异常路径。升级完成不等于事情结束,"网站没倒"也不是验收标准。三问自查一次:5xx和worker退出有没有异常新增(升对了)、登录表单上传回调是否全好(升稳了)、你的PHP分支还在不在官方维护列表里(有没有被补丁市场淘汰)。三个都有答案,这波才真的算是补完了。