生产环境必须用composer install --no-dev --optimize-autoloader:前者剔除phpunit等dev依赖防安全与性能风险,后者生成静态类映射提升加载性能,二者缺一不可。

生产环境必须用 composer install --no-dev --optimize-autoloader
不加 --no-dev 会导致 phpunit、laravel/pint 这类开发依赖被装进生产环境,轻则多占几十 MB 空间,重则触发 Class 'Tests\TestCase' not found 或因缺少 ext-intl 直接 fatal error。--optimize-autoloader 生成静态类映射,减少运行时文件查找,对请求响应时间有实际提升(尤其在 shared hosting 或低配容器中)。
常见错误:CI 流水线里只跑 composer install,没加参数,结果上线后报错;或本地开发机上跑了 composer update 却忘了 git add composer.lock,导致别人 composer install 失败——因为 lock 文件里压根没记录新版本。
-
--no-dev不是“可选”,是生产环境的硬性开关 -
--optimize-autoloader在 PHP 8+ 下效果更明显,但 7.4 也建议加上 - 别用
--ignore-platform-reqs绕过平台检查,它掩盖的是真实环境不兼容问题
Docker 构建中 composer install 必须分层缓存 + 非 root 用户
把 composer.json 和 composer.lock 提前 COPY 到构建阶段,再执行 composer install,才能利用 Docker layer 缓存。如果先 COPY 整个代码再装依赖,每次改一行代码都会重跑整个安装流程。
同时,RUN composer install 前必须切换到非 root 用户(如 USER app),否则 vendor 目录权限继承 root,后续运行时可能因权限拒绝加载扩展或写日志。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 顺序必须是:
COPY composer.json composer.lock ./→USER app→RUN composer install --no-dev --no-scripts --no-progress --no-interaction --optimize-autoloader -
--no-scripts很关键:避免生产镜像里意外执行post-install-cmd脚本(比如生成密钥、清缓存等),这些操作不该在构建时发生 - 私有包认证别硬编码进 Dockerfile,用
--secret挂载或 CI 环境变量注入COMPOSER_AUTH
CI/CD 流水线里漏掉 composer.lock 检查 = 自动引入不确定性
CI 脚本开头必须加一步:test -f composer.lock || (echo "ERROR: composer.lock missing" >&2; exit 1)。只要 .gitignore 里写了 composer.lock,或者有人 git commit 时漏提交,后续所有 composer install 就退化成按 composer.json 重新解析——哪怕只是 monolog/monolog 从 3.5.0 升到 3.6.0,也可能因内部方法签名变更导致你的日志逻辑崩溃。
- Composer 2.5+ 已强化校验:若
composer.lock缺少composer.json中声明的包,install直接失败,这是保护机制,不是 bug - CI 中用
composer install --prefer-dist加速下载,压缩包比 git clone 快得多 - 别在 CI 里跑
composer update—— 它该是人审过的动作,不是自动化流程的一部分
线上服务器真的需要运行 composer install 吗?
不需要,也不推荐。生产服务器通常没装 Composer,PHP 内存限制常低于 1.5G,且 web 用户不该有写 vendor/ 权限。composer install 触发的 post-autoload-dump 可能暴露路径,post-root-package-install 可能意外执行初始化逻辑。
正确做法:在 CI 或本地干净环境(PHP 版本、扩展严格匹配线上)执行 composer install --no-dev --optimize-autoloader,把整个 vendor/ 打包上传,或通过 rsync 同步过去。
- 若必须在线安装(比如老旧运维流程),先确认
COMPOSER_HOME指向可写目录,并设memory_limit=1536M - 线上 PHP 版本低于本地?必须在
composer.json的config.platform.php显式声明,否则可能拉错版本(例如本地 PHP 8.3 装了只兼容 8.2 的包) -
composer.lock的哈希值和下载地址都固化在文件里,它不只是版本号列表——这就是为什么不能靠人工“猜”该装什么

















