scf部署时composer install卡住本质是镜像未生效,因scf容器不持久化composer_home,需在scf.yaml或构建脚本中显式执行三行命令:配置腾讯云镜像(带末尾/)、设http.timeout为600、设http-max-concurrent-downloads为8,并加--no-interaction --prefer-dist参数。

SCF 部署时 composer install 卡住,本质是镜像没生效
腾讯云函数(SCF)每次部署都从干净容器启动,COMPOSER_HOME 不持久化,全局镜像配置会丢失。你本地 composer config -g repo.packagist 成功,对 SCF 完全无效——它根本读不到你的 ~/.composer/config.json。
常见错误现象:composer install 日志里反复出现 Downloading https://packagist.org/packages.json 或卡在 Loading composer repositories 30 秒以上;curl -I https://mirrors.cloud.tencent.com/composer/packages.json 在本地能通,但在 SCF 构建环境里超时。
- 必须在
scf.yaml或构建脚本开头显式执行镜像配置命令,不能依赖本地全局设置 - SCF 默认使用 PHP 运行时自带的 Composer(通常是 2.x),但不预装任何镜像配置
- 别用
--repository=临时参数——它只对当前命令生效,而 SCF 的composer install是内部触发的,你无法插手参数 - 验证是否生效的唯一方式:在 SCF 构建日志中搜索
mirrors.cloud.tencent.com,而不是看本地composer config输出
必须配的三行命令:镜像 + 超时 + 并发
仅设镜像源远远不够。SCF 环境 DNS 解析慢、TLS 握手不稳定、单次 HTTP 请求容易卡在首字节,必须同步调三个关键配置:
-
composer config -g repo.packagist composer https://mirrors.cloud.tencent.com/composer/(注意末尾/,缺了就 404) -
composer config -g http.timeout 600(默认 60 秒,SCF 内网偶尔首字节延迟高,设为 10 分钟更稳) -
composer config -g http-max-concurrent-downloads 8(并发太高触发腾讯云镜像限流,parallel-downloads已废弃,别用)
这三行必须放在 install 前执行,且顺序无关。如果用 scf.yaml 的 build 阶段,写成 shell 脚本片段即可;若用 CI/CD 流水线,加在 before_install 里。
SCF 构建脚本里漏掉 --no-interaction 和 --prefer-dist 就会失败
SCF 构建环境无 TTY 终端,composer install 默认交互模式会卡死,且默认可能 fallback 到 --prefer-source(直连 GitHub),绕过所有镜像配置。
- 必须显式调用:
composer install --no-interaction --prefer-dist --optimize-autoloader -
--no-interaction防止卡在“Do you want to store credentials for mirrors.cloud.tencent.com?”这类提示 -
--prefer-dist强制走压缩包下载(镜像站有缓存),而非git clone(绕过镜像,易被 GitHub 限速或封 IP) -
--optimize-autoloader不影响拉包速度,但避免后续冷启动时 autoloader 扫描耗时,属于上线必加项
如果项目用了私有仓库(如 GitLab 自建包),确保它们走 SSH 或 token 认证,不要混用 https:// + 用户密码——SCF 构建环境不支持交互式输入凭证。
SCF 中最容易被忽略的 DNS 和 IPv4 问题
即使镜像 URL 正确、超时调大、并发设低,仍可能卡在 Loading composer repositories ——这不是 Composer 问题,是底层 cURL 的 DNS 解析或 IPv6 fallback 拖慢了。
- 加环境变量强制走 IPv4:
export COMPOSER_IPV4=1,可跳过 IPv6 探测(SCF 容器内 IPv6 支持不稳定) - 加环境变量禁用 cURL DNS 缓存:
export COMPOSER_DISABLE_DNS_CACHE=1,防止复用旧解析结果指向海外 IP - 别信“多加几个镜像源”,SCF 不支持
repositories数组 fallback:一个源超时就干等,不会自动切下一个 - 腾讯云镜像域名
mirrors.cloud.tencent.com在 SCF 内网直连,但若你用了自定义 VPC 或安全组,需放行该域名的 HTTPS 出向流量(不是 IP,因为 CDN 节点会变)
最终效果不是“快一点”,而是让 composer install 从不可靠变成可预期:稳定在 40–90 秒完成,不再随机超时或卡死。











