热更新必须执行 composer install --no-dev --optimize-autoloader,否则 classmap 不更新导致 class not found;该命令重扫源码、重写 autoload_classmap.php,而 dump-autoload -o 在 composer 2.x 中无效。

不会断网,但热更新时若忽略 autoloader 重建逻辑,会导致新类加载失败、500 错误或静默降级——这不是网络问题,而是 classmap 没覆盖新增/修改的类文件。
热更新后 Class not found 是因为 classmap 没刷新
线上热更新(如 rsync 新代码、git pull 后直接 reload PHP-FPM)不触发 Composer 任何自动加载重建。vendor/composer/autoload_classmap.php 是静态快照,只在 composer install 或 composer update 时生成。哪怕你改了 app/Http/Controllers/Api/UserController.php 并确保命名空间正确,只要没重新运行安装命令,classmap 里就还是旧路径甚至压根没有它。
- 常见现象:请求返回
Class 'App\Http\Controllers\Api\UserController' not found,但文件明明存在、权限正常、Nginx/Apache 也通 - 根本原因:autoloader 还在用旧的 classmap,而新类不在里面;PSR-4 fallback 被
--classmap-authoritative关闭了,连“试试拼路径”这步都跳过 - 验证方式:检查
vendor/composer/autoload_classmap.php是否包含该类名,或运行php -r "var_dump(require 'vendor/composer/autoload_classmap.php')['App\Http\Controllers\Api\UserController'];"
热更新必须补上 composer install --no-dev --optimize-autoloader
不能只靠 composer dump-autoload -o —— 它在 Composer 2.x 中已不生成有效 classmap,且不处理 dev 依赖残留。真正安全的热更新步骤是:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先停掉流量(如摘除 LB 节点、切到维护页),避免请求打到半更新状态
- 同步新代码后,立刻执行:
composer install --no-dev --optimize-autoloader --prefer-dist --no-interaction - 确认
vendor/composer/autoload_classmap.php文件 mtime 已更新,且大小明显增长(比如从 2KB 变成 120KB) - 重启 PHP-FPM 进程(必要!否则 APCu 缓存或 opcache 仍持有旧 autoload 实例)
- 再恢复流量
为什么不用 dump-autoload --optimize 或 --classmap-authoritative 单独跑
这两个命令在热更新场景下基本无效甚至危险:
-
composer dump-autoload --optimize在 Composer 2.0+ 中只是--classmap-authoritative的别名,它不扫描文件、不写入autoload_classmap.php,只改autoload_static.php并强制关闭 fallback —— 类一漏就直接炸 -
composer dump-autoload --classmap-authoritative同样不生成 classmap,只是告诉 autoloader “信这张表”,但表本身可能空或过期 - 即使你手动加了
"classmap": ["app/"]到composer.json,dump-autoload -a也只扫一次,无法感知热更新后新增的文件(除非你额外加 watch + trigger 逻辑,得不偿失) - 唯一可靠路径:让
install重走完整流程,清掉旧 vendor、重解依赖、重扫源码、重写 classmap
APCu 和 opcache 不会掩盖 classmap 过期问题
开了 --apcu-autoloader 或配置了 apc.enable_cli=1,只会缓存已加载的 classmap 数组,不会自动检测文件变更。opcache 缓存的是 PHP 文件字节码,跟类映射无关。所以:
- 热更新后不重装 autoload,APCu 里存的还是旧 classmap,查不到新类
- opcache 可能缓存了旧的
vendor/autoload.php或控制器文件,需配合opcache_reset()或killall php-fpm && systemctl start php-fpm - 最稳妥做法:把
composer install --no-dev --optimize-autoloader当作热更新原子操作的一部分,不拆、不省、不绕
热更新不是“拷完代码就完事”,classmap 是硬快照,它不会自己长眼睛认新文件。漏掉 composer install 这步,等于让整个 autoload 系统在裸奔。










