composer本身不提供未使用依赖检测功能,它仅管理require声明和安装,不分析代码中use、new等实际调用;唯一可行方案是使用composer-unused工具扫描php源码真实引用,辅以人工验证配置、注解及运行时加载。

Composer本身不提供“未使用依赖”检测功能
Composer是包管理器,不是代码分析工具——它只管require声明和安装,不管这些包在你的PHP代码里有没有被use、new或call_user_func调用过。直接运行composer show或composer outdated完全无法回答“哪些包没被用到”这个问题。
真正可行的方案:用PHPStan + phpstan-deprecation-rules + 自定义规则
目前最贴近需求的实操路径是静态分析:先提取项目中所有use语句和类/函数调用,再比对vendor/下的已安装包。推荐组合:phpstan/phpstan(v1.10+)配合phpstan/extension-installer和社区扩展phpstan-deprecation-rules,再手动排除dev-dependencies(如phpunit、mockery)。
- 运行前确保
composer install --no-dev(避免dev包干扰判断) - 在
phpstan.neon中启用PHPStanRulesClassesUnusedClassRule和PHPStanRulesFunctionsUnusedFunctionRule - 对
vendor/目录不做扫描,只扫描src/和app/等业务代码目录 - 注意:第三方包里的
class_alias、function_exists动态调用会被漏判,这类需人工核对
快速验证某一个包是否可能被弃用
如果只想快速排查单个包(比如怀疑guzzlehttp/guzzle只在测试里用了),可用grep结合composer show -i交叉验证:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
composer show -i | grep "guzzlehttp/guzzle" grep -r "use.*Guzzle" --include="*.php" src/ app/ grep -r "new Guzzle" --include="*.php" src/ app/ grep -r "GuzzleHttp\" --include="*.php" src/ app/
若全部无结果,再检查config/里是否有YAML/PHP配置引用(如Laravel的config/services.php)、或composer.json中是否仅作为replace或provide存在——这种属于“声明式依赖”,实际代码层确实没调用。
别信“自动清理脚本”,风险极高
网上有些脚本声称能“一键删未使用包”,它们基本靠grep vendor/autoload.php或扫描composer.lock的autoload字段反推,但PHP的__autoload、spl_autoload_register、甚至eval()加载都绕过这些机制。曾有团队用这类脚本删掉symfony/polyfill,结果生产环境mb_strlen直接报错。
真正安全的做法只有两步:先用静态分析圈出候选包,再逐个在CI里注释require行 + 运行全量测试 + 观察错误堆栈——vendor/目录里每个包的名字,都对应着某处你还没发现的隐式调用。










