-o选项通过生成全量类名到文件路径的静态映射表(classmap)替代动态路径拼接与文件检查,禁用__autoload兜底逻辑,并配合--classmap-authoritative确保仅查表加载,显著提升生产环境自动加载性能。

这个选项主要优化自动加载的性能,核心是把 PSR-0/PSR-4 类映射转换成一张“类名 → 文件路径”的静态查找表(classmap),跳过运行时的目录遍历和文件存在性检查。
生成 classmap 替代动态查找
默认情况下,Composer 对 PSR-4 或 PSR-0 命名空间采用“按命名规则拼路径 + 检查文件是否存在”的方式加载类。每次 new 一个类,就可能触发多次文件系统调用。启用 -o 后,Composer 会扫描所有已安装包中的 PHP 文件,提前建立完整的类到文件路径的映射,并写入 vendor/composer/autoload_classmap.php。运行时直接查表返回路径,不依赖目录结构或文件名猜测。
禁用 __autoload 的兜底逻辑
未启用优化时,如果类没在 PSR 映射中匹配成功,Composer 会尝试用旧式 __autoload 兜底(比如检查 PEAR 风格路径)。而 -o 生成的 classmap 是全量且确定的,Composer 自动禁用这部分兜底逻辑,减少无谓判断。
合并并压缩 autoloader 文件
该选项通常与 --classmap-authoritative 协同使用(Composer 2.0+ 默认开启)。它告诉 autoloader:“classmap 就是全部,别再费劲去磁盘找没列进去的类了”。这不仅提升速度,还能避免因文件权限、符号链接或临时文件导致的意外加载行为。
适合生产环境,开发阶段一般不用
因为 classmap 是构建时生成的,一旦源码新增类但没重新 dump-autoload,就会报错“Class not found”。所以它适合部署后不再改代码的场景:
- CI/CD 流水线打包时加 -o
- Docker 构建镜像时执行 composer install --no-dev -o
- 线上服务器部署后运行 composer dump-autoload -o










