Vercel PHP 运行时限制
解读
国内面试官问“Vercel PHP 运行时限制”,并不是想听你背官方文档,而是考察三件事:
- 你是否真的在 Serverless 场景下用过 PHP,还是只会在虚拟主机里放 WordPress;
- 面对“无状态、冷启动、执行时长”这些 Serverless 原生存量限制,你能否快速定位瓶颈并给出国内可落地的绕行方案;
- 当业务必须上 Serverless 但官方又不支持 PHP 时,你的技术选型与说服能力。
因此,回答思路要先“承认现实”——Vercel 官方运行时列表里没有 PHP,再“给出限制”——即使你通过社区 Runtime 或 Docker 强行跑通,也会遇到冷启动、体积、扩展、合规四大门槛,最后“反向输出”——把限制翻译成国内云厂商(阿里云 FC、腾讯云 SCF、华为云 FunctionGraph)的对标参数,让面试官听到你的“云原生迁移经验”。
知识点
- Vercel 官方运行时:Node.js、Go、Python、Ruby、Rust,无 PHP。
- 社区 workaround:vercel-php(cyclic.sh 维护)、vercel-builder-php,本质把 php-fpm 与 nginx 打进 50 MB 层,走 Lambda@Edge。
- Serverless 通用限制:
- 冷启动:AWS Lambda 在 us-east-1 平均 200 ms(256 MB),PHP 镜像 800 ms+;
- 执行时长:API Gateway 29 s(HTTP)/ 15 min(Event),国内云厂商一般 60 s 触发超时;
- 体积:解压后 250 MB(/tmp 512 MB),PHP 带 Laravel 极易超标;
- 扩展:不支持持久连接、Redis 长连接、OPcache 常驻,每次请求重编译;
- 合规:Vercel 边缘节点全部在海外,国内 ICP 备案域名无法直接 CNAME,需额外做 CDN 回源或备案接入。
- 国内对标:
- 阿里云 FC:PHP 7.4/8.1 官方运行时,冷启动 100 ms,代码包 500 MB,临时目录 512 MB,单次执行 10 min;
- 腾讯云 SCF:PHP 8.0,支持挂载 CFS 做 Vendor 分离,冷启动 80 ms;
- 华为云 FunctionGraph:PHP 8.2,内置 Composer 缓存层,可把 200 MB vendor 拆层。
- 绕行策略:
- 把 FPM 模式改 CLI 模式,减少 nginx 层;
- 使用 Bref 或 Swoole Runtime 提前编译 vendor,瘦身 60%;
- 关键扩展用静态编译 .so,放弃 apt 安装;
- 对冷启动敏感接口,用 CDN 边缘缓存 + ESI 拼装,降低 90% 触发;
- 国内业务直接迁移至阿里云 FC,通过 Serverless Devs 工具链保持 Vercel-like 体验,备案问题一次解决。
答案
Vercel 官方目前没有 PHP 运行时,任何 PHP 项目上线 Vercel 都只能依赖第三方 Runtime,典型限制如下四条:
- 冷启动慢:社区 Runtime 需要同时拉起 nginx 与 php-fpm,镜像体积 80 MB+,北美节点冷启动 800 ms~1.2 s,远高于 Node.js 的 100 ms,直接影响首屏体验。
- 体积与扩展:解压后代码 + Composer vendor 必须小于 250 MB,Laravel 全量引入就 180 MB,再装 gd、zip、redis 扩展极易超限;且每次请求都要重新加载 PHP 扩展,OPcache 无效,QPS 一高 CPU 飙升。
- 执行时长:API Gateway 硬性 29 s 超时,若你的 PHP 脚本需要跑大批量报表或远程拉取第三方数据,必须拆成异步队列,否则 502 报错。
- 合规与网络:Vercel 边缘节点全部在海外,国内未备案域名无法直接解析;即使备案成功,跨省访问延迟 200 ms+,违背“边缘计算”初衷。
国内落地建议:如果业务受众主要在大陆,直接把代码包迁移到阿里云函数计算 FC 的 PHP8.1 运行时,冷启动 100 ms、执行时长 10 min、代码包 500 MB,配合 CDN + 函数触发器,可 1 小时完成 Vercel 到 FC 的平滑迁移;若必须保留 Vercel 的 GitOps 体验,可用 Serverless Devs 的 s-vercel 插件,把 push 事件同步到 FC,实现“代码在 GitHub,流量在国内”的双轨架构。
拓展思考
- 如果公司技术委员会坚持“云中立”,要求同一套 PHP 代码在 AWS Lambda、Vercel、阿里云 FC 三朵云同时跑,你会如何设计持续集成流水线,保证 layer 体积、扩展版本、环境变量三朵云一致?
- 当 PHP 8.4 推出 JIT 2.0 时,Serverless 场景下 JIT 预热时间可能大于请求耗时,你会选择提前生成 opcache.preload 还是放弃 JIT 只用 opcache?
- 国内金融客户要求“函数计算出公网 IP 固定且可备案”,但云厂商默认动态出口,你如何借助 NAT 网关 + EIP + Serverless 私网架构满足合规,同时又不破坏按量付费模型?