生产环境只允许执行composer install --no-dev --optimize-autoloader,严禁update/require/dump-autoload;须预构建vendor/、移除composer.phar、严格管控权限与环境变量,实现零依赖运行。

生产环境只允许 composer install,禁用 update 和 require
运维人员在部署时唯一合法操作是 composer install --no-dev --optimize-autoloader。任何 composer update、composer require 或 composer dump-autoload 都必须被阻断——它们会绕过 composer.lock 的确定性约束,引入未经验证的代码变更。
最直接的拦截方式是在部署脚本开头加判断:
if grep -q "update\|require\|dump-autoload" &2 exit 1 fi
更稳妥的做法是:部署容器或用户环境里根本**不提供 composer.phar 可执行文件**,只提供预构建好的 vendor/ 目录和校验脚本(如比对 sha256sum vendor/.lock),彻底移除命令入口。
让 PHP 进程能读 vendor,但不能写,也不依赖 composer 命令
关键不是“给运维什么权限”,而是让整个运行时环境对 composer 命令零依赖。这意味着:
-
vendor/必须由 CI 构建阶段生成并同步到生产机,而非现场安装 - PHP 进程(如
www-data)只需对vendor/有r-x权限,不需要写、不需要执行composer -
vendor/bin/下的可执行文件(如phinx)应单独chmod +x,其余文件保持644;目录本身设为755,不可写 - 确保
www-data属于deploy组,且vendor/所属组为deploy,避免因属主不匹配导致opendir()失败
auth.json 和插件白名单必须预置且不可修改
运维人员不应接触任何凭证或插件配置。所有私有仓库认证必须提前注入构建镜像或部署包中:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
auth.json放在项目根目录下,权限设为600,且不进 Git;CI 构建时用--no-interaction注入 -
composer.json中显式声明"config": {"allow-plugins": {"symfony/flex": true, "laravel/pint": false}},禁止运行时动态启用插件 - 生产环境部署前强制设置
COMPOSER_NO_INTERACTION=1和COMPOSER_DISABLE_XDEBUG=1,防止交互提示或调试扩展干扰
如果部署包里还留着 auth.json 的占位符或空文件,PHP 进程尝试读取时可能触发未授权访问日志告警,这是容易被忽略的暴露点。
权限修复命令要按层执行,不能 chmod -R 555
chmod -R 555 vendor/ 是典型错误:它砍掉所有文件的执行位,同时让子目录失去 x 位,PHP 连 opendir() 都失败,报错类似 failed to open stream: Permission denied。
正确顺序是分层收紧:
-
chown -R deploy:deploy vendor/(归属部署用户,非 root) -
chmod 755 vendor/(目录必须有x位才能遍历) -
find vendor/ -type f -exec chmod 644 {} \;(所有文件去写,保留组读) -
chmod +x vendor/bin/* 2>/dev/null || true(仅放行明确需要执行的二进制)
最后检查 vendor/composer/autoload_static.php 是否为 644——如果它是 600,www-data 就读不了, autoload 会静默失败,而不是报错。










