本文目录导读:

- 📚 目录导读
- 为什么 PHP 开发者需要关注 Serverless?
- PHP Serverless 的三种主流落地姿势
- 国内 vs 海外平台选型对比
- 手把手实战:将 Laravel 项目部署到阿里云 FC
- 常见坑与性能调优(必踩)
- PHP Serverless 高频问答(Q&A)
- 总结建议
PHP 怎么用 Serverless?从零到生产环境的实战指南(2025年最新版)
📚 目录导读
- 为什么 PHP 开发者需要关注 Serverless?
- PHP Serverless 的三种主流落地姿势(函数计算 / 容器实例 / BaaS 化改造)
- 国内 vs 海外平台选型对比(阿里云 FC / AWS Lambda / 腾讯云 SCF)
- 手把手实战:把 Laravel 项目部署到 Serverless(含代码示例)
- 常见坑与性能调优(冷启动、长连接、文件系统)
- PHP Serverless 高频问答(Q&A)
为什么 PHP 开发者需要关注 Serverless?
很多 PHPer 觉得 Serverless 是 Node.js 和 Python 的专属。其实不然,根据 2024 年云原生报告,PHP 在 Serverless 场景的增长率达到了 62%,主要驱动力来自:
- 成本黑洞:传统 PHP-FPM 常驻内存,空闲期也在烧钱,Serverless 按请求计费,流量低谷时几乎零成本。
- 弹性扩容:双十一大促时,PHP 传统架构需要提前扩容机器,Serverless 自动伸缩到千级并发。
- 运维降级:你不再需要管理 Nginx、PHP-FPM 进程、证书续期,只写业务代码。
但 PHP 有个天然门槛——无状态与共享文件,传统 PHP 依赖本地 Session 文件、上传目录,这跟 Serverless 的“用完即焚”理念冲突,落地前必须先懂架构改造。
PHP Serverless 的三种主流落地姿势
🅰️ 姿势一:函数计算(FaaS)——适合 API 与轻逻辑
以阿里云函数计算 FC 为例,你把 PHP 脚本打包成一个函数,入口是 index.php 中的 handler:
<?php
function handler($event, $context) {
$name = $event['queryString']['name'] ?? 'World';
return [
'statusCode' => 200,
'headers' => ['Content-Type' => 'text/plain'],
'body' => "Hello, $name from PHP Serverless!"
];
}
部署命令(使用官方 CLI):
# 安装 Serverless Devs npm install -g @serverless-devs/s # 初始化 PHP 模板 s init start-php # 部署 s deploy
适用场景:短信发送 API、Webhook 回调、图片裁剪、轻量查询代理,如果你的项目只是几十个接口,选这个最省钱。
🅱️ 姿势二:容器实例(Serverless 容器)——适合完整框架
如果你不想改 Laravel/ThinkPHP 的代码结构,可以把整个项目打包成 Docker 镜像,跑在阿里云 ECI(弹性容器实例)或 AWS Fargate 上,但注意:这属于“Serverless 化的容器”,不是函数计算,计费粒度是秒级,而非毫秒级。
Dockerfile 核心部分:
FROM php:8.2-fpm-alpine COPY . /var/www/html RUN composer install --no-dev # 用内置 PHP 服务器启动,端口设置为 8080 CMD ["php", "-S", "0.0.0.0:8080", "-t", "/var/www/html/public"]
然后配一个触发器(如 API Gateway),指向这个容器的 8080 端口,这种方式的优点是不用改业务代码,缺点是冷启动比函数计算慢(约 2-5 秒)。
🅲 姿势三:BaaS 化改造——彻底拥抱无状态
最推荐但最费功夫,你需要:
- Session 迁移:把
$_SESSION改为 Redis 存储(Laravel 自带支持)。 - 文件上传:本地磁盘改为 OSS(对象存储),用
oss-sdk替换move_uploaded_file()。 - 数据库连接池:Serverless 实例频繁重启,每次新建 MySQL 连接会拖垮数据库,务必使用连接池(如
PDO+persistent属性,或者用 Swoole 常驻内存处理)。
改造后的 Laravel config/database.php 示例:
'options' => [
PDO::ATTR_PERSISTENT => true, // 开启长连接
],
国内 vs 海外平台选型对比
| 平台 | 支持 PHP 版本 | 冷启动(平均) | 并发上限 | 典型费用(100万次调用) | 特殊优势 |
|---|---|---|---|---|---|
| 阿里云 FC | 5 ~ 8.2 | 300ms | 单函数 3000 | 约 ¥35 | 与 DCDN、OSS 深度集成 |
| 腾讯云 SCF | 6 ~ 8.0 | 400ms | 2000 | 约 ¥28 | 微信生态友好 |
| AWS Lambda | 6 ~ 8.3 | 800ms (含镜像拉取) | 1000 | 约 $8 | 全球边缘节点多 |
| 百度智能云 CFC | 6 ~ 8.2 | 500ms | 1500 | 约 ¥30 | AI 服务集成 |
决策建议:如果你的用户全在中国大陆,优先选阿里云 FC——生态最完整,文档中文,如果是出海业务,AWS Lambda 配合 API Gateway 更稳。
手把手实战:将 Laravel 项目部署到阿里云 FC
这是一个 98% 能跑通的真实案例,假设你已有 Laravel 11 项目:
第一步:初始化 Serverless 配置文件
在项目根目录创建 serverless.yml:
service: my-laravel-app
provider:
name: aliyun
runtime: php8.2
region: cn-shanghai
functions:
index:
handler: index.handler
runtime: php8.2
timeout: 30
memorySize: 512
events:
- http:
path: /
method: ANY
authType: ANONYMOUS
第二步:编写 index.php 入口
为了兼容 Laravel 的路由,我们需要将 Serverless 的 $event 转换成 Symfony Request:
<?php
require __DIR__ . '/vendor/autoload.php';
$app = require_once __DIR__ . '/bootstrap/app.php';
function handler($event, $context) {
global $app;
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
// 构造请求
$method = $event['http']['method'] ?? 'GET';
$uri = $event['http']['path'] ?? '/';
$query = $event['queryString'] ?? [];
$body = $event['body'] ?? '';
$request = Illuminate\Http\Request::create(
$uri, $method, $query, [], [],
$_SERVER, json_decode($body, true) ?? []
);
// 处理请求
$response = $kernel->handle($request);
$content = $response->getContent();
return [
'statusCode' => $response->getStatusCode(),
'headers' => $response->headers->all(),
'body' => $content,
];
}
第三步:处理文件存储
在 .env 中配置 OSS:
FILESYSTEM_DISK=oss
ALIYUN_OSS_BUCKET=your-bucket
ALIYUN_OSS_ENDPOINT=oss-cn-shanghai.aliyuncs.com
然后安装 alibabacloud/oss-sdk,并自定义一个 Storage 驱动。绝不能在 Serverless 里写本地磁盘。
第四步:部署 & 压力测试
s deploy
s invoke -f index --event '{"http":{"method":"GET","path":"/api/users"}}'
如果返回 JSON 正常,说明部署成功,此时你的费用约为传统 ECS 的 1/5 到 1/10(低流量时段)。
常见坑与性能调优(必踩)
🔥 冷启动优化
- 使用 预留实例(阿里云 FC 提供“预付费实例数”),可以避免 90% 的冷启动。
- 精简 Composer 依赖,弃用无用扩展(如
imagick)可减少启动时间。 - 开启 PHP OPcache 并持久化,参考代码:
opcache.enable=1 opcache.fast_shutdown=1 opcache.validate_timestamps=0
🔥 数据库连接风暴
200 个函数实例同时启动,每个创建 1 个 MySQL 连接,你的数据库立刻爆掉,解决方案:
- 改用 PolarDB 的 SLO 模式(Serverless 数据库)。
- 或使用 Redis 做一层数据缓存,减少 DB 命中。
🔥 文件系统临时目录
只有 /tmp 目录可写,且最大 512MB,如果上传文件,必须直接流式传给 OSS,不要落地。
PHP Serverless 高频问答(Q&A)
❓ Q1:我的老 ThinkPHP 5 项目能迁到 Serverless 吗?
可以,但 ThinkPHP 5 的 runtime/ 下默认会写缓存文件,需改成 Redis 缓存,建议先用容器实例模式过渡,再做函数化。
❓ Q2:PHP Serverless 适合长连接(如 WebSocket)吗? 不适合,函数计算和 Lambda 的设计是短请求,如果做实时聊天,建议把 WebSocket 服务独立部署在 ECS,或者用云厂商的 WebSocket API 网关(如阿里云 API 网关支持 WebSocket),后端收到消息后调用函数处理。
❓ Q3:怎么调试本地环境?
推荐用 bref(适用于 AWS Lambda 的 PHP 运行环境)或阿里云的 fun local invoke,本地跑通 handler(→_→) 函数后,再部署上去。
❓ Q4:和 Go / Node.js 比,PHP 在 Serverless 上有什么缺陷? 主要两点:1)启动性能稍慢(PHP 初始化框架约 100ms,Node 约 50ms);2)没有原生的 async/await 异步模型,但 PHP 的优势在于生态成熟、学习成本低,尤其适合已有大量 PHP 代码的团队。
❓ Q5:有哪些知名公司 PHP 用 Serverless? 品牌电商的秒杀系统、支付回调、报表导出等,例如某头部电商的售后 Excel 导出功能,原用时 30 分钟,改造为函数后 3 秒异步生成并推送 OSS,成本降了 80%。
总结建议
不要执着于把整个 Monolith 塞进函数。 聪明的做法是:先把“边缘逻辑”抽出来——比如图片处理、邮件发送、订单超时未支付查询——这些高频或低频但资源消耗大的任务,拆成独立函数,主框架继续跑在轻量容器实例上。
PHP Serverless 不是玄学,它只是换了一种更极致的资源调度方式,从今天开始,先拿一个非核心接口做 POC 试点,跑通后再逐步扩大范围。没有银弹,只有适不适合的架构。