腾讯云 SCF 多函数共享层

解读

在国内 Serverless 落地场景中,腾讯云 SCF(Serverless Cloud Function)是主流选择之一。面试官问“多函数共享层”,并不是让你背文档,而是考察:

  1. 你是否理解 PHP 运行时冷启动瓶颈;
  2. 能否把 Composer 依赖、扩展、二进制工具抽成独立层,让多个函数复用,降低代码包体积与冷启动耗时;
  3. 是否熟悉层版本管理、灰度发布、权限隔离以及和 CFS、镜像的取舍;
  4. 能否给出 CI/CD 落地脚本,让“层”随代码一起版本化。

一句话:用“层”把“不变”的 PHP 依赖与“常变”的业务代码解耦,实现毫秒级冷启动与低成本治理。

知识点

  1. 层(Layer)本质:ZIP 包 + 固定目录结构(/opt/),SCF 启动时自动挂载为只读文件系统。
  2. PHP 运行时搜索顺序:/var/runtime/bootstrap → /opt/php/lib/php/extensions → /opt/bin → 用户代码目录;通过 PHP_INI_SCAN_DIR 可追加额外 ini。
  3. 构建技巧:
    • 使用官方 php:7.4-cli-alpine 容器,把 composer install --no-dev --optimize-autoloader 后的 vendor 打到 /opt/php/vendor;
    • 扩展层:把编译好的 .so 放到 /opt/php/lib/php/extensions/no-debug-non-zts-20190902,并在 /opt/php/etc/php/conf.d/ 放 30-ext.ini;
    • 二进制层:把 ffmpeg、wkhtmltopdf 等放到 /opt/bin,并保证 ld-linux-x86-64.so.2 依赖存在。
  4. 版本管理:层版本一旦发布不可变,函数配置里用 “层 ARN+版本号” 绑定;灰度时同时发布新层版本与新函数版本,再按 10%、50%、100% 流量切换。
  5. 权限隔离:层支持 CAM 策略,层作者与使用者可分离;敏感扩展(如 swoole-loader)可放在私有层,仅授权给指定账号。
  6. 限制:层解压后 ≤ 500 MB,单个函数最多 5 层,且挂载顺序会影响文件覆盖;PHP CLI 与 FPM 运行时均支持层。
  7. 冷启动对比:未用层前 900 ms(50 MB 代码包+200 MB 依赖),用层后 120 ms(仅 2 MB 业务代码),降幅 85%。
  8. 与 CFS、镜像方案对比:CFS 需 VPC 环境,网络挂载耗时 20~30 ms,且跨可用区有抖动;镜像预热成本高,适合 1 GB 以上单体业务;层在 500 MB 以内性价比最高。

答案

“在腾讯云 SCF 里,我会把 PHP 的不变部分拆成三类层,让多个函数共享:

  1. 扩展层:预编译 swoole、redis、imagick 等常用扩展,打包成 layer-ext-so.zip,结构为 /opt/php/lib/php/extensions/… 和 /opt/php/etc/php/conf.d/,发布为 arn:layer:php-ext:3;
  2. 依赖层:在官方 alpine 容器里执行 composer install --no-dev,把 vendor 打到 /opt/php/vendor,生成 layer-vendor.zip,发布为 arn:layer:php-vendor:16;
  3. 二进制层:把 chromium-headless、ffmpeg 静态编译后放到 /opt/bin,并附带 ld-musl-x86_64.so.1,发布为 arn:layer:bin-tools:5。

函数代码只保留 src/ 与 bootstrap,总大小 1.8 MB。serverless.yml 里按顺序挂载:

layers:

  • arn:layer:php-ext:3
  • arn:layer:php-vendor:16
  • arn:layer:bin-tools:5

这样任何函数只要引用这三层即可复用全部环境与依赖。灰度发布时,先在 CI 里并行构建新层版本与函数版本,通过 tencentcloud cli 更新别名权重,实现 0 中断上线。实测冷启动从 900 ms 降到 120 ms,包体积缩小 96%,每月出流量费用下降 42%。”

拓展思考

  1. 层与“自定义运行时”结合:把 PHP 8.2 与 FrankenPHP 打包成层,实现 Workers 常驻,进一步把冷启动降到 30 ms 以下,同时保持 Serverless 弹性。
  2. 层缓存预热:利用 SCF 预置并发 + 层快照,提前把层解压到快照盘,避免首次并发突增时 500 MB 层解压带来的 3~5 s 抖动。
  3. 多账号分发:把层通过 Tencent Cloud Organization 共享给子账号,结合 Tags 实现“按项目扣费”,解决集团内各子公司依赖统一扩展的治理难题。
  4. 安全加固:层内 .so 加入 SHA256 白名单,函数启动时通过 /opt/bootstrap 校验扩展指纹,防止“依赖投毒”;同时把层放在私有网络存储桶,开启 KMS 加密。
  5. 与 Laravel Octane 搭配:把 Swoole 扩展层 + Octane 打包成层,函数启动后监听 9000 端口,通过 API Gateway 的 WebSocket 支持长连接,实现“Serverless 常驻”微服务,单实例 QPS 可破 3000,兼顾弹性与性能。