京东云 FunctionCompute 当前仅支持 PHP 7.4 和 8.1 版本;入口必须为根目录 index.php 中的 handler($event, $context) 函数;依赖需用 --no-dev --optimize-autoloader 打包;环境变量与密钥须通过控制台配置,不可硬编码或读取 .env。

京东云 FunctionCompute 的 PHP 运行时支持哪些版本
京东云 FunctionCompute 当前(2024 年)官方明确支持的 PHP 运行时只有 php7.4 和 php8.1,不支持 php8.2+ 或 php7.3 及更早版本。如果你本地用的是 php8.3 开发,直接打包上传会触发冷启动失败,日志里通常只显示 Failed to start runtime,没有更具体的错误路径提示。
实操建议:
- 开发阶段就用 Docker 拉取京东云镜像验证:运行
docker run -it jdcloudfunction/php74:latest php --version确认基础环境 -
composer.json中的"php": "^8.1"必须降级为"php": "8.1.*",否则composer install --no-dev --optimize-autoloader在构建时可能因平台约束报错 - 不要依赖
pcntl、sockets或sysvshm等扩展——这些在京东云函数中默认未启用,启用需提工单,且多数场景不被允许
函数入口文件必须叫 index.php 且暴露 handler 函数
京东云要求 PHP 函数的入口文件固定为项目根目录下的 index.php,且必须定义一个名为 handler 的全局函数(不能是类方法、匿名函数或命名空间内函数)。这个函数接收两个参数:$event(触发事件数据)和 $context(运行时上下文),返回值会被序列化为响应体。
常见错误现象:上传 ZIP 后控制台显示“函数状态异常”或调用返回空响应,但日志无报错——大概率是入口函数名/签名不匹配。
正确写法示例:
<?php function handler($event, $context) {
// $event 是 JSON 解码后的 array,不是原始字符串
$body = $event['body'] ?? '';
return [
'statusCode' => 200,
'headers' => ['Content-Type' => 'application/json'],
'body' => json_encode(['msg' => 'hello', 'len' => strlen($body)])
];
}
注意点:
-
$event已由平台自动json_decode($rawBody, true),无需再调用json_decode - HTTP 触发器下,
$event结构与 AWS API Gateway v2 兼容,包含rawQueryString、headers、requestContext等字段,但isBase64Encoded始终为false - 函数不能有
exit()或die(),否则上下文回收异常,可能影响后续并发请求
依赖打包必须用 --no-dev --optimize-autoloader
京东云函数对部署包体积敏感,ZIP 解压后代码目录总大小不能超过 250MB(含 vendor),且冷启动时会扫描全部 PHP 文件做 opcode 缓存预热。如果 vendor/ 里混入了 .git、tests/、docs/ 或大量 dev-only 包(如 phpunit、symfony/var-dumper),会导致上传失败或超时。
推荐构建流程:
- 在干净目录中执行:
composer install --no-dev --optimize-autoloader --ignore-platform-reqs - 用
zip -r function.zip index.php vendor/ src/打包,避免包含.env、node_modules、composer.lock(后者虽不执行但占体积) - 检查 ZIP 内部结构:
unzip -l function.zip | head -20,确认没有意外嵌套目录(如project/src/而非src/)
性能影响:未启用 --optimize-autoloader 时,每次请求都会遍历 vendor/autoload.php 中的 classmap,冷启动延迟能增加 300–800ms。
环境变量和 Secret 配置要通过控制台或 CLI 设置,不能硬编码
京东云不支持在函数 ZIP 包内读取 .env 文件,getenv('DB_HOST') 默认返回 false,除非该变量已在函数配置页显式添加。Secret(如数据库密码、API Key)必须使用京东云 KMS 或 Secret Manager 创建,并在函数配置中以“引用密钥”方式挂载——此时变量值是解密后的内容,而非密钥 ID。
容易踩的坑:
- 在
index.php顶部写if (file_exists('.env')) { ... }——该文件不会随 ZIP 上传生效 - 把 Secret ID(如
ak-xxxxx)当实际值用,导致连接数据库失败,错误日志里只显示PDOException: SQLSTATE[HY000] [2002],无密钥相关提示 - 环境变量名含下划线(如
REDIS_URL)可正常读取,但含短横线(如redis-url)会被转成REDIS_URL,PHP 中需用getenv('REDIS_URL'),不能用$_ENV['redis-url']
复杂点在于:Secret 挂载后,变量值是运行时注入的,无法在 composer install 阶段用于配置生成。如果有类似 config/database.php 依赖环境变量初始化,必须改造成运行时 lazy-load,而不是在文件顶层执行 new PDO(...)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











