生产环境部署 composer 项目需在 composer install --no-dev --optimize-autoloader 后主动清理 vendor 中的 bin/、tests/、.git、docs/、examples/、installed.json 等冗余文件,并用 --classmap-authoritative 替代已废弃的 --optimize,同时屏蔽 /vendor/ 访问、确保 composer.lock 部署一致、验证 autoload 和核心服务。

生产环境部署 Composer 项目,核心不是“装不装 dev 依赖”,而是“删不删 vendor 里不该留的东西”——composer install --no-dev --optimize-autoloader 是底线,但光靠它远远不够。
为什么 composer install --no-dev 不等于安全上线
这个命令只跳过 require-dev 里的包,但很多危险残留仍留在 vendor/ 里:
-
vendor/bin/下的开发工具(如phpunit、phpcs)可能被意外执行,尤其当 web 目录权限配置不当或存在路径遍历漏洞时 -
vendor/{package}/tests/、vendor/{package}/docs/、vendor/{package}/.github/等目录虽不参与运行,却可能暴露源码结构或敏感注释 - 某些包的
autoload-dev配置会把测试类注册进 autoloader,--no-dev并不清理已生成的vendor/composer/autoload_*.php文件
真正该删的文件和目录:用 composer install 后再清理
推荐在 composer install --no-dev --optimize-autoloader 完成后,用脚本或构建步骤主动剔除冗余内容。常见必须清理项:
-
vendor/bin/—— 全部删除(除非你明确需要某个二进制如phinx在线上运行) -
vendor/**/tests/、vendor/**/Tests/、vendor/**/test/、vendor/**/Test/ vendor/**/{.git,.gitignore,.travis.yml,phpunit.xml,phpstan.neon,psalm.xml}-
vendor/**/docs/、vendor/**/examples/、vendor/**/demo/ -
vendor/composer/installed.json(含完整包版本与哈希,泄露可辅助攻击者判断组件漏洞)
Linux/macOS 下可用 find vendor -path '*/tests' -o -path '*/.git' -o -name 'phpunit.xml' -delete 快速清理;CI/CD 中建议用 rm -rf 显式声明,避免依赖 glob 模糊匹配漏删。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
composer dump-autoload --optimize 的真实作用和陷阱
这个命令生成静态类映射(vendor/composer/autoload_classmap.php),能绕过 PSR-4 的文件系统查找,提升性能。但它有硬性前提:
- 仅对 PSR-0/PSR-4 自动加载规则生效,对
classmap或files类型无加速效果 - 如果项目中用了动态类名拼接(如
new $className且$className不在 autoload map 里),可能导致类找不到——因为优化后 autoloader 默认不 fallback 到文件扫描 -
--optimize已被标记为废弃(Composer 2.2+),应改用--apcu(需 APCu 扩展)或直接信任默认的 classmap 生成逻辑
生产环境更稳妥的做法是:确保 composer.json 中 "autoload" 配置准确,然后只跑 composer dump-autoload --classmap-authoritative —— 这个选项强制 autoloader 完全信任 classmap,不查文件,既安全又高效。
部署时最容易被忽略的三个点
这些不是“配置错误”,而是“部署流程没覆盖到”的隐性风险:
-
vendor/composer/installed.php和vendor/composer/installed.json默认可被 web 访问,若 web 根目录未屏蔽/vendor/,攻击者能直接下载看到所有依赖版本 —— 必须在 web server 配置中 deny access to/vendor/ -
composer.lock必须随代码一起部署,但它的时间戳和换行符差异可能引发 CI 构建失败;建议在 git 中设置* text eol=lf,并统一用composer install --no-interaction避免交互中断 - 某些共享主机或容器环境禁用
proc_open(),会导致composer install在解包阶段失败(报错类似failed to open stream: operation failed);此时需提前用composer archive打包,或改用--prefer-dist+ 确保unzip命令可用
上线前最后一步,永远是验证 vendor/autoload.php 能被正常 require,且关键服务(如 DB 连接、缓存初始化)不因 autoloader 缺失类而静默失败——别只看首页 HTTP 200。










