离线环境Class not found的根本原因是vendor/autoload.php未注册新类映射。需检查composer.json autoload配置、文件名与命名空间一致性、执行composer dump-autoload -o,并验证autoload_static.php等三文件是否同步正确。

composer autoload 为什么在离线环境报 Class not found
离线时 Composer 不会重新生成 autoloader,但你改了类文件路径或命名空间,composer dump-autoload 又没跑成功——这时 PHP 就真找不到类了。核心问题不是“没网”,而是 vendor/autoload.php 里没注册你新加/改过的类映射。
常见错误现象:Fatal error: Uncaught Error: Class "AppServicesFooService" not found,但文件明明在 app/Services/FooService.php,且命名空间也对。
- 确认
composer.json的"autoload"段是否包含对应规则(如"psr-4": {"App\": "app/"}) - 检查类文件名是否严格匹配类名(
FooService.php→class FooService),大小写敏感(尤其 Linux 离线环境) - 运行
composer dump-autoload -o(注意:离线前就得有composer.phar二进制,且不能依赖网络下载插件) - 若用
classmap,确保执行时加--classmap-authoritative避免运行时扫描,否则离线后扫描失败直接挂掉
离线调试时如何快速验证 autoloader 是否生效
不靠 composer install 或 require 全局逻辑,直接测加载器本身最可靠。
- 写个最小测试脚本,只引入
vendor/autoload.php,然后var_dump(class_exists('AppServicesFooService')); - 用
composer show --platform看 PHP 版本是否匹配(离线机器的 PHP 版本可能比开发机低,导致某些 autoload 规则不生效) - 检查
vendor/composer/autoload_psr4.php文件,搜索你的命名空间前缀,看映射路径是否正确(比如"App\" => ["app/"],而不是"app/"少了尾部斜杠) - 如果用了
files类型 autoload,确认对应文件路径是相对vendor/composer/的,不是相对项目根目录——离线复制时容易漏掉这类文件
composer dump-autoload 在无网络下失败的几个硬坑
看起来只是本地命令,但它可能偷偷联网:比如检测插件、校验签名、甚至某些自定义 scripts 里写了 curl。
- 禁用所有插件:运行时加
-n参数,即composer dump-autoload -n -o - 删掉
composer.json里的"scripts"中任何带exec、curl、wget的逻辑(离线时它们会卡住或报错) - 避免使用
composer-plugin-api版本太新的插件(如hirak/prestissimo),离线环境下握手失败概率高 - 如果之前用过
composer config -g repo.packagist composer https://packagist.org,离线机器上要删掉全局配置(~/.composer/config.json),否则dump-autoload会尝试连包管理器
离线部署前必须检查的三个文件
很多“类找不到”问题,其实是这几个文件没同步过去,或者权限/路径不对。
-
vendor/autoload.php:不是生成完就一劳永逸,它会 require 其他 autoload_*.php,缺一个就断链 -
vendor/composer/autoload_static.php:优化模式(-o)下主映射表,类名到文件路径的硬编码数组,离线全靠它——改了类却忘了重生成,这里就不会更新 -
vendor/composer/installed.php:记录已安装包及其 autoload 配置,如果它是空数组或格式损坏,PSR-4 映射根本不会加载










