接手一个4年前的PHP项目,我踩的5个坑和复盘

王尘宇 经验分享 1

上个月接手了一个2019年的老项目,PHP 5.6,ThinkPHP 3.2.3,数据库MySQL 5.5。客户说“不难,就是几个小功能改一下”。结果搞了两周。复盘一下踩过的大坑,后面如果遇到类似情况可以参考。

坑一:本地根本跑不起来

第一件事当然是搭本地环境。PHP 5.6在2026年的macOS上已经装不上了——Homebrew早就不支持了。最后用Docker拉了个php:5.6-apache镜像才跑起来。数据库导出来300MB,导入到本地MySQL 8.0直接报错——datetime字段默认值“0000-00-00”在新版MySQL里是非法值。花了一下午改SQL模式。

教训:接手老项目之前,先确认你能搭出它的运行环境。有时候配环境的时间比改代码还长。

坑二:没有文档,变量命名像密码

整个项目没有一行注释。变量名叫$a、$b、$c,函数名叫doit()、check()、handle()。我花了一整天画流程图才搞明白核心业务逻辑。后来学乖了——每看懂一个函数就顺手加一行注释,不然两天后再看又忘了。

坑三:改了“小功能”,崩了另外一个不相关的功能

客户要加一个导出Excel的功能,看起来简单——加个按钮、写个PHPExcel导出逻辑。测试也过了。上线第二天客服电话被打爆:后台订单列表打不开了。查了半天发现是导出功能require了一个PhpSpreadsheet库,里面有个类的命名空间跟项目里一个古老的第三方库冲突了。

教训:老项目加新依赖要特别小心命名空间冲突,尤其是ThinkPHP 3.x这种没有Composer管理的项目。

坑四:SQL注入就在眼前

老代码里大量的字符串拼接SQL,像这样:$sql = "SELECT * FROM users WHERE id = " . $_GET['id']。一百多个地方。客户说“之前一直没事啊”,那是因为之前没人恶意攻击。花了两天用参数化查询全部改了一遍。

坑五:迁移PHP 7的时候,ext/mysql没了

项目里大量用mysql_connect()、mysql_query()——这些函数在PHP 7里彻底移除了。全部得改成mysqli或者PDO。而且ThinkPHP 3.2.3对PHP 7的兼容性也不好,最后选了一个社区fork版本才跑起来。

总结:接手老项目,先备好Docker环境,边看边加注释,加新依赖要检查冲突,顺手修安全问题,升级PHP版本是一道大坎。

标签: 经验分享 PHP老项目 项目复盘 代码维护 技术债务

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~