PHP 怎么用Serverless

wen PHP项目 2

本文目录导读:

PHP 怎么用Serverless

  1. 📚 目录导读
  2. 为什么 PHP 开发者需要关注 Serverless?
  3. PHP Serverless 的三种主流落地姿势
  4. 国内 vs 海外平台选型对比
  5. 手把手实战:将 Laravel 项目部署到阿里云 FC
  6. 常见坑与性能调优(必踩)
  7. PHP Serverless 高频问答(Q&A)
  8. 总结建议

PHP 怎么用 Serverless?从零到生产环境的实战指南(2025年最新版)

📚 目录导读

  1. 为什么 PHP 开发者需要关注 Serverless?
  2. PHP Serverless 的三种主流落地姿势(函数计算 / 容器实例 / BaaS 化改造)
  3. 国内 vs 海外平台选型对比(阿里云 FC / AWS Lambda / 腾讯云 SCF)
  4. 手把手实战:把 Laravel 项目部署到 Serverless(含代码示例)
  5. 常见坑与性能调优(冷启动、长连接、文件系统)
  6. 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 化改造——彻底拥抱无状态

最推荐但最费功夫,你需要:

  1. Session 迁移:把 $_SESSION 改为 Redis 存储(Laravel 自带支持)。
  2. 文件上传:本地磁盘改为 OSS(对象存储),用 oss-sdk 替换 move_uploaded_file()
  3. 数据库连接池: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 试点,跑通后再逐步扩大范围。没有银弹,只有适不适合的架构。

抱歉,评论功能暂时关闭!