本文目录导读:

PHP代码日常维护是一个需要体系化安排的工作,不能只靠“出bug再修”,一个良好的维护计划能让代码长期保持健康、安全且易于扩展。
下面是一个比较成熟的维护框架,按频率和类型来划分:
每日/每周例行(常态化)
这部分是“灭火”和“监控”,确保系统基本运行。
-
错误日志检查:
- 做什么:查看
error_log、php_error_log,以及监控工具(如Sentry、Airbrake)的告警。 - 重点关注:E_WARNING、E_NOTICE(可能暗示未定义变量、数组索引不存在)、E_PARSE(语法错误)、Fatal Error。
- 行动:优先处理新增的致命错误和频繁出现的警告。
- 做什么:查看
-
快速安全扫描:
- 做什么:检查是否有针对特定漏洞的扫描、暴力破解登录尝试。
- 工具:
fail2ban日志、WAF(Web应用防火墙)日志。 - 行动:被封禁的IP是否合理?是否需要更新安全规则?
每月/每季度常规维护(预防性)
这部分是“保养”,防止小问题变成大问题。
-
依赖更新:
- 做什么:使用
composer update检查 PHP 依赖包(特别是安全相关的库,如symfony/security,laravel/framework)。 - 注意:不要直接在生产环境
composer update,先在开发/测试环境运行,并执行所有单元测试和集成测试,关注composer outdated的结果。 - 行动:更新
composer.json中的版本约束,并运行测试。
- 做什么:使用
-
代码质量与风格检查:
- 做什么:
- 运行 PHPStan 或 Psalm(静态分析,检测潜在的类型错误、逻辑漏洞)。
- 运行 PHP CodeSniffer 或 PHP-CS-Fixer(统一团队代码风格)。
- 运行 PHPMD(检查代码复杂度、重复代码、过长方法等)。
- 行动:修复新出现的代码问题,特别是未定义变量、弱类型比较导致的逻辑错误,以及过长的
if-else或switch。
- 做什么:
-
数据库维护:
- 做什么:
- 检查慢查询:通过
SHOW FULL PROCESSLIST或数据库慢查询日志,找出执行时间超过1秒的SQL。 - 分析索引使用情况:
EXPLAIN慢查询,优化索引。 - 表优化:定期执行
OPTIMIZE TABLE(特别是经常增删改的表,如sessions,logs)。
- 检查慢查询:通过
- 行动:优化慢查询、添加缺失索引、清理过期数据(如超过90天的 session 日志)。
- 做什么:
-
安全更新:
- 做什么:
- 关注 PHP 官方安全公告(https://www.php.net/security.php)。
- 更新 PHP 版本(如 8.0 -> 8.2,特别是安全补丁)。
- 更新 Web 服务器(Apache/Nginx)和数据库(MySQL/PostgreSQL)的补丁。
- 行动:安排窗口,升级 PHP 小版本或修补库。
- 做什么:
年度深度维护(战略性)
这部分是“体检”,为代码未来1-2年的健康做准备。
-
废弃特性清理:
- 做什么:PHP 每个大版本(如 7.4 -> 8.0)都会移除一些函数或特性(如
mysql_*函数、each()、create_function())。 - 行动:运行
php -l检查语法,或使用静态分析工具(如PHPStan)扫描到“Deprecated”级别的错误,逐步替换这些代码。
- 做什么:PHP 每个大版本(如 7.4 -> 8.0)都会移除一些函数或特性(如
-
技术债务重构:
- 做什么:识别“屎山”代码(如1000行以上的函数、过度复杂的类、硬编码配置)。
- 行动:选择最常修改或性能瓶颈的模块进行重构(遵循“童子军规则”:每次改动时,让代码比之前干净一点)。
-
性能基准测试:
- 做什么:使用 Xdebug 的 Code Coverage 或 Profiling 工具,分析代码执行时间。
- 行动:优化最耗时的函数(通常位于循环、数据库查询、文件操作中),考虑引入 Redis 或 Memcached 缓存热点数据。
具体维护操作清单(Checklist)
你可以把下面这个清单做成一个 Maintenance Checklist.md 放在项目里:
# PHP 项目日常维护检查清单 ## 每日/每周 - [ ] `error_log` 无可疑错误 - [ ] 监控工具无新增致命错误 - [ ] 登录尝试无异常(fail2ban日志正常) ## 每月/每季度 - [ ] 更新 `composer.lock`(经测试后) - [ ] 运行 `composer outdated`,记录需要更新的安全包 - [ ] 运行 `./vendor/bin/phpstan analyse --level=max` - [ ] 运行 `./vendor/bin/phpcs --standard=PSR12 src/` - [ ] 检查 MySQL/PostgreSQL 慢查询日志,优化`EXPLAIN`时间>1秒的查询 - [ ] 备份并清理旧日志:`find /var/log -name "*.log" -mtime +30 -delete` - [ ] 更新 PHP 及扩展(`apt update && apt upgrade php*`) ## 每年 - [ ] 检查并移除 `@deprecated` 的 PHP 函数调用(如 `mysql_*`,`ereg_*`) - [ ] 运行一次 Profiling(`xhprof` 或 Xdebug),优化 Top 10 慢函数 - [ ] 检查所有 `composer.json` 中的依赖库是否仍有维护者(若无人维护,考虑替换) - [ ] 清理过期的数据库表(如 `cache_*`, `sessions`) - [ ] 代码审查:检查是否存在未处理的异常(未 `catch` 的 `Throwable`)
工具推荐
- 静态分析:PHPStan(推荐)、Psalm(严格模式)
- 代码格式化:PHP-CS-Fixer(团队必备)
- 性能调试:Xdebug +
cachegrind.out/ 黑火(Blackfire.io) - 监控:Sentry(错误追踪)、New Relic(APM)、Prometheus + Grafana(自定义指标)
- 安全:Roave Security Advisories(
composer audit新功能)、OWASP Zap(渗透测试)
常见“坑”与应对
- 忘记
opcache重置:修改了 PHP 文件后,如果使用opcache,网页不会立即生效,部署脚本中加入opcache_reset()或重启 PHP-FPM。 - 依赖冲突:
composer update时出现不兼容,建议锁定composer.lock,只在有明确需求时更新,并在测试环境充分验证。 - 时区问题:
date_default_timezone_set('Asia/Shanghai')或UTC统一管理,避免系统时区与PHP时区不一致导致的时间计算错误。 - 日志未分割:设置
logrotate自动分割日志,防止日志文件过大撑爆磁盘(特别是php-fpm.log)。
维护节奏建议
| 频率 | 耗时 | |
|---|---|---|
| 每日 | 扫日志、修紧急bug | 15分钟 |
| 每周 | 安全检查、性能监控 | 1小时 |
| 每月 | 更新依赖、代码静态分析、慢查询优化 | 半天 |
| 每季度 | 技术债务拆解、废弃特性清理、索引维护 | 1-2天 |
| 每年 | 大版本升级规划、深度Profiling、安全审计 | 1周 |
核心原则:永远不要在出问题的第一时间直接在生产环境修改代码。 先通过日志和监控定位问题,然后在测试环境中复现,通过单元测试验证修复,最后再部署。