老 PHP 项目该不该重构升级?代码能跑就别大动!!
我接手了一个跑了多年的 PHP 项目,功能还算稳定,但依赖老、写法也旧。每次修小问题都怕牵一发动全身,想升级又担心重构成本打水漂,大家会怎么判断?
这个问题几乎每个做 PHP 的人都会遇到,但是最近它变得更紧迫了,因为刚出完的那两个 PHP 漏洞,把一批老项目直接逼到了墙角。

先说我的答案,总结为两句话:
第一,代码能跑,就不要为了「代码现代化」去推倒重来。
第二,升级 PHP 版本和重构代码,是两件完全不同的事,别把它们捆在一起。
很多人正是因为把这两件事捆住了,结果既不敢升、也没重构,最后暴露在漏洞里。
代码能跑,就不要大动
这条原则听起来保守,但它是拿事故换来的。
一个跑了多年的系统,最大的价值不是代码写得多漂亮,而是它里面沉淀了大量没人记得住的业务细节。一个看起来莫名其妙的判断、一段绕来绕去的兼容逻辑、一个注释都没写的字段映射,背后往往是一次线上事故、一个特殊客户的特殊要求、或者一个早就没人提起的历史约定。
这些东西不在文档里,也不在 Git 提交记录里,只在这份能跑的代码里。
推倒重来的风险在于,你以为你在重写代码,其实你在重写一份没人能完整复述的业务规则。而验证它是否正确的唯一方式,就是上线。
所以重构的风险天然是失控的。它很容易让团队陷进去:改到一半发现依赖比想象的深,新代码和老逻辑对不上,业务方又在催新需求,最后两头不靠,进退两难。这就是常说的重构地狱。
更现实的是,重构的收益往往说不清。跑得好好的系统,重构完还是那些功能,业务方感知不到变化,但你要花掉几个月工期,还要承担线上事故的风险。这笔账,很难有人批。
所以我的看法是:没有明确的、反复出现的痛点,就不要为了「代码现代化」去动它。
要不要动,看的是「痛不痛」,而不是「旧不旧」。
重构要拆进日常,不要攒成一次豪赌
当然不是永远不动。业务在长,系统总得改。但优雅的做法不是去动老代码,而是把老系统当成一个黑盒,在外围长出新东西。
具体是三步:
第一步,把边界隔离。新功能别写进老系统,用独立的外部服务来做,新的语言、新的框架都行。老 PHP 系统只当它是个提供数据和能力的服务,通过接口调。
第二步,把流量分出去。 用 API 网关、Nginx 路由转发,或者干脆微服务化的思路,让新业务走新代码、新架构,老业务继续由旧 PHP 顶着。两边各活各的,互不打扰。
第三步,痛点驱动,单点剥离。 别定什么“三年重构完”的大计划。等到某个老模块因为因为业务频繁变动、痛点实在太大,改一次就要全站回归、新人接手得啃半个月,这时候再针对这一小块做重构或剥离。
这么做的好处是,每一次改动的范围都很小,都能回滚,都能验证,风险被拆散了。
一句话总结:能分两次完成的风险,千万不要合并成一次豪赌。
但这次 PHP 漏洞不一样,不再受支持就自己编译
说完重构,再说升级,因为这两件事最近被混在一起了。
10 月 21 日 PHP 官方发布了两个严重漏洞的补丁,编号 CVE-2026-109618 和 CVE-2026-109619,CVSS 评分 9.2,不需要登录、发一个请求就能在服务器上执行代码,圈里管它叫 php2shell。

很多人的第一反应是「要升 PHP 了,那是不是得先重构」,然后把两件事一起搁置。这个等号是错的。
首先:PHP 在同一个大版本内是承诺向下兼容的。 7.4.1 升到 7.4 的最新小版本、8.1.x 升到 8.1 的最新小版本,正常情况下不会让你的业务代码跑不起来。真正需要改代码的是跨大版本升级(比如 7.4 升 8.0),因为那里面有废弃特性和行为变更。
所以你可以只升环境,不动代码,先把运行环境升到受支持的状态,测试环境跑一遍看报错日志,只有真撞到不兼容的地方才改那一处。
具体到你现在跑的版本,路径可能不一样:
8.2 及以上,直接升就行。 官方给的修复版本是 8.5.12、8.4.27、8.3.36、8.2.35,四个受支持分支同一天到齐。发行版和 LTS 厂商提前拿到了补丁,正常更新即可。
8.1 及更早,我的建议是自己编译。
这些版本官方早就不再维护了,没有现成的安装包可用。但因为这次漏洞太严重,官方破例为 7.4、8.0、8.1 提供了最小化的源码补丁(backport),专门给那些自己从源码构建、或者拿不到 LTS 厂商支持的人。
注意「最小化」三个字:它不是一份完整的新版本升级包,只是修掉这两个 CVE 的最小补丁集,得自己往源码上打、自己编译。几件事别漏:
先确认版本和运行方式。 php -v 看版本,再确认是 mod_php 还是 PHP-FPM。这次漏洞在 Apache 加 mod_php 上最危险,未授权请求可以在任何应用代码运行之前触发,默认配置下已经演示出完整的 RCE;换成 PHP-FPM 处境要好一大截,前两条攻击路径直接走不通。
补丁打完重新编译后,重启所有长驻进程。 只重启 Web 服务是不够的。
长期还是建议换到有 LTS 支持的发行版或者厂商。 自己编译是把安全责任全扛自己身上,这次官方破例不代表以后都有。
多说两句
回到开头那个问题:老 PHP 项目要不要为了升级而重构一次?
不要为了升级而重构,但因为怕重构就不升级,更危险。
这两件事的成本差太多了。重构是几个月工期加不可控的线上风险;升级运行环境,通常就是更新一下、或者重新编译一次、重启一下进程、看一遍日志。用后者的代价去解决前者的恐惧,是最划算的做法。
老项目不可怕,可怕的是它既没人敢动,又跑在一个没人管的版本上。
先让它在受支持的运行环境里安全稳定地跑起来,把重构拆解到日常的新功能迭代里去。 这才是对业务和团队都负责的做法。
