如何查找legacy PHP电商项目中未被引用的孤立PHP文件?
排查并移除PHP项目中未被引用文件的可行方法
针对动态include/require较多的遗留PHP项目,单纯用grep确实无法覆盖所有场景,试试下面这些落地性强的思路:
1. 静态代码分析工具(覆盖静态+半动态引用)
- 用PhpStorm或VSCode的PHP静态分析插件(比如PHP Intelephense),这类工具能识别字符串拼接类的半动态引用(比如
include 'modules/' . $module . '.php'),只要变量的可能取值能被静态推断,就能关联到对应文件。 - 导出项目的引用关系图,标记所有被识别到的文件为“已使用”,剩余文件则列为待核查的嫌疑文件。
2. 运行时跟踪+日志记录
动态引用只能在运行时捕捉,可通过钩子脚本实现:
- 重写
include/require系列函数,或者利用PHP的auto_prepend_file配置,在所有脚本加载前引入一个跟踪脚本,记录每次成功加载的文件绝对路径。 - 完整跑一遍项目的所有功能流程(包括用户端、管理后台的核心路径及边角功能),收集全量日志。
- 日志中出现的文件即为确认被使用的,未出现的再做人工核查。
示例简化版跟踪脚本:
<?php // track-includes.php $usedFiles = []; function track_include($path) { global $usedFiles; $realPath = realpath($path); if ($realPath && !in_array($realPath, $usedFiles)) { $usedFiles[] = $realPath; file_put_contents('/tmp/used_files.log', $realPath . PHP_EOL, FILE_APPEND); } return include($path); } // 替换原生include函数 rename_function('include', '_original_include'); override_function('include', '$path', 'return track_include($path);'); // 同理处理require、include_once、require_once
之后在php.ini中配置auto_prepend_file = /path/to/track-includes.php,或在项目入口文件顶部直接引入该脚本。
3. 结合版本控制系统历史排查
如果项目使用Git等版本控制系统,可筛选长期未修改且无引用记录的文件:
# 列出超过1年未被修改的PHP文件 git ls-files --modified=-365d *.php # 用blame查看这些文件是否被其他代码静态引用过 git blame -- *filename*.php
这类长期无人问津的文件大概率已废弃,可优先标记核查。
4. 逐步更名验证(最稳妥的兜底方案)
对嫌疑文件做备份后,逐个(或按模块批量)修改文件名(比如old_file.php改为old_file.php.bak),再运行项目自动化测试(若有)或人工覆盖核心流程。
- 若未出现报错,说明该文件确实未被使用;若报错,立即恢复文件名即可。
内容的提问来源于stack exchange,提问作者Jinsu Oh
相关产品推荐
相关产品推荐

