phpstan 的 result cache 与 composer 缓存完全隔离,清 composer 缓存无效;必须用 phpstan clear-result-cache 清理 phpstan 自身缓存,尤其在 autoload 变更、配置调整或升级后。

Composer 本身不缓存“依赖关系分析结果”,所谓缓存只是 PHPStan 或 Psalm 这类工具自己生成的 result cache(如 phpstan/cache),和 Composer 的 vendor/ 或 composer.lock 无关;误以为清 Composer 缓存就能解决 PHPStan 报错,往往白忙一场。
PHPStan 的 result cache 和 Composer 缓存完全隔离
PHPStan 启动时会读取自己的 phpstan/cache 目录(默认在项目根目录下),里面存的是 AST 解析结果、类型推导快照、已检查文件指纹等。它和 Composer 的 ~/.composer/cache 或 vendor/ 没有任何共享逻辑。
-
composer clear-cache只清下载包的 tarball 和 metadata,不影响 PHPStan 的任何判断 -
composer dump-autoload会更新vendor/autoload.php,但 PHPStan 是否加载它,取决于你是否显式传了--autoload-file=vendor/autoload.php - 如果你改了
composer.json的autoload配置但没运行dump-autoload,PHPStan 即使带--autoload-file也加载不到新路径——因为vendor/autoload.php里没注册
为什么 phpstan clear-result-cache 才是真清理
CI 或本地反复报错时,最常见原因是旧缓存残留了错误的符号定义(比如某个类被删了但缓存还记着它的方法签名)。这时候必须用 PHPStan 自己的命令清:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
vendor/bin/phpstan clear-result-cache—— 清掉所有缓存,强制下次全量重分析 -
vendor/bin/phpstan clear-result-cache --php-version=8.2—— 如果项目跨 PHP 版本测试,缓存是按版本隔离的,得指定清哪一版 - 不要手动
rm -rf phpstan/cache:PHPStan 会重建目录结构,但可能漏掉锁文件或元数据,导致后续运行卡住
缓存失效的典型场景:autoload 变更后没触发重载
当你新增一个 autoload.files(比如加了 src/helpers.php),或修改了 PSR-4 映射,PHPStan 不会自动感知——它只认你启动时传进去的 autoloader 状态。
- 即使你跑了
composer dump-autoload,若 PHPStan 命令没带--autoload-file=vendor/autoload.php,它仍用旧的、未更新的 autoloader - 如果用了
includes引入了第三方扩展(如phpstan-laravel),而该扩展的extension.neon里又依赖bootstrapFiles,那这些文件的变更也需重新触发 PHPStan 加载 - 验证是否生效:加
-v参数运行,输出里必须出现Loading autoloader和Loaded 123 files,否则说明 autoload 没真正接入
真正容易被忽略的点是:缓存不是“越清越好”,而是“该清才清”。频繁清 cache 会让 CI 变慢;但从不清,又容易让错误持续掩盖真实问题。关键在于每次 autoload 变更、PHPStan 配置调整、或升级 PHPStan 小版本后,主动执行一次 clear-result-cache —— 别等报错再动手。










