Serverless平台指定PHP版本由配置项决定:Cloudflare Workers依赖composer.json的config.platform.php锁定兼容性;AWS Lambda+Bref通过bref.yml的runtime字段映射预编译镜像;Vercel/Netlify则分别依据.php-version文件或PHP_VERSION环境变量确定版本,配错将导致部署失败或冷启动报错。

Serverless 平台(如 AWS Lambda、Cloudflare Workers、Vercel、Bref)不让你直接管理 PHP 二进制或 php-fpm,所以「指定 PHP 版本」不是改 fastcgi_pass 或切 phpenv,而是由平台配置项决定——配错就部署失败,或函数冷启动报错。
Cloudflare Workers + PHP:用 composer.json 的 config.platform.php 锁定兼容性
Cloudflare Workers 不运行传统 PHP,但可通过 Bref 或自建 PHP 运行时打包为 WASM/OCI。此时 CLI 环境和部署包环境分离,php -v 无意义,真正起作用的是 composer.json 中的平台声明:
-
composer config platform.php 8.2.10必须写完整小版本号,不能写8.2或^8.2 - 执行后立刻跑
composer update --lock,否则composer.lock仍按本地 CLI 版本解析依赖 - 这个设置只影响
require匹配(比如避开php: >=8.3的包),不保证 runtime 有mbstring—— 扩展需在构建层显式启用
AWS Lambda + Bref:bref.yml 里的 runtime 是唯一生效入口
Bref 将 PHP 打包为 Lambda 层,runtime 字段直接映射到预编译镜像,填错就拉不到层:
- 合法值只有
php-8.0、php-8.1、php-8.2、php-8.3(Bref 2.x 不支持php-7.4及更旧) - 写成
php-8.2-fpm或php82会部署失败,错误信息是LayerNotFoundException -
php.ini覆盖必须放在php-ini配置块下,不能靠ini_set()—— Lambda 启动时已加载完毕
Vercel / Netlify:PHP 版本由构建缓存隐式决定,php -v 输出不可信
这些平台不暴露 PHP CLI,也不允许你启停 fpm;它们用 Docker 构建 PHP 应用,版本由 composer.lock + 构建镜像共同锁定:
立即学习“PHP免费学习笔记(深入)”;
- 若
composer.lock里platform.php是8.1.10,但项目根目录有.vercel/php-version文件写了8.2,以文件为准(Vercel 优先级更高) - Netlify 则依赖
PHP_VERSION环境变量,必须在 UI 或netlify.toml中明确定义:PHP_VERSION = "8.2" -
phpinfo()页面在 Vercel 上默认禁用,且即使启用,其Server API显示的是apache2handler(模拟值),不是真实 SAPI
本地调试与线上不一致?重点查 opcache.enable 和 date.timezone
Serverless 环境默认关闭 opcache(冷启动性能优先),而本地开发常开启;date.timezone 在 Lambda/Bref 中必须显式设为 UTC,否则 DateTime 构造失败:
- Bref 中加
php-ini块:opcache.enable=0、date.timezone=UTC - Vercel 的
.vercel/php-config.ini仅影响 CLI 构建阶段,不影响 runtime —— timezone 必须在代码里date_default_timezone_set('UTC') - Cloudflare Workers 的 WASM PHP 运行时无法修改
timezone,只能靠new DateTime('now', new DateTimeZone('UTC'))显式传参



















