生产环境必须运行 composer install --optimize-autoloader --no-dev,本地开发禁用 --optimize-autoloader,因 Laravel 5.5 未默认启用 ClassMap 校验,-o 会强制生成 classmap 但不验证路径匹配性,导致类找不到。

生产环境必须跑 composer install --optimize-autoloader --no-dev,本地开发别碰 --optimize-autoloader,否则改个类名就报错、php artisan tinker 直接挂。
为什么 dump-autoload -o 在 Laravel 5.5 是危险操作
Laravel 5.5 还没默认启用 ClassMap 优化逻辑,--optimize(或 -o)会强制把所有 PSR-4 路径扫成 classmap,但不校验命名空间与文件路径是否真正匹配。一旦漏扫或路径大小写不对(比如 app/Http/Controllers 写成 app/http/controllers),classmap 就为空,运行时 fallback 机制又被 --classmap-authoritative 关掉,结果就是 Class not found。
-
dump-autoload -o只生成映射,不验证类是否存在;install --optimize-autoloader才会在安装依赖时同步校验路径有效性 - Laravel 5.5 的
artisan optimize命令会生成compiled.php,但它和 Composer classmap 无关,别混用 - 如果你手动改过
composer.json的autoload段,必须先删掉vendor/composer/autoload_*.php再重装,否则旧映射残留
--classmap-authoritative 开了却报错,怎么快速定位漏类
不是 Composer 坏了,是 classmap 没覆盖到那个类——它根本没被扫描进去。重点查三处:
- 运行
composer dump-autoload --classmap-authoritative --no-dev后,打开vendor/composer/autoload_classmap.php,搜你报错的类全名(如App\Services\PaymentService);没找到就说明漏了 - 确认该类文件在
composer.json的"autoload": {"psr-4": {...}}映射范围内,且命名空间末尾有反斜杠("App\": "app/",不是"App": "app/") - 检查文件路径是否含非法字符或大小写问题:Linux 下
app/Services/PaymentService.php里写了namespace AppServices是对的,但若写成namespace appservices就不会被收录
OPcache 和 APCu 不只是“开了就行”,它们卡在 autoload 第一跳
vendor/autoload.php 本身没被 OPcache 缓存,--classmap-authoritative 再快也白搭。必须同时满足:
-
opcache.enable=1且opcache.enable_cli=1(FPM 和 CLI 都要开) -
opcache.memory_consumption足够大(至少 128M),否则 autoload_classmap.php(几 MB)直接被踢出缓存 - APCu 必须启用且
apcu.enabled=1,Laravel 的 config cache、route cache 依赖它,而这些缓存会间接影响 autoloader 初始化顺序 - 部署后执行
php -r "var_dump(opcache_get_status()['scripts']['vendor/autoload.php'] ?? 'not cached');",输出数组才算真生效
最常被忽略的是 classmap 的“静态性”:它不随文件增删自动更新。上线前加了个 app/Jobs/NotifyJob.php,但忘了跑 composer install --optimize-autoloader --no-dev,classmap 还是旧的——这种问题不会报错,只会让新 Job 在队列里静默失败。











