PHP项目Serverless部署实战指南
📚 目录导读
- 为什么PHP项目需要Serverless?
- Serverless部署PHP的三种主流方案
- 案例:从零部署一个Laravel应用到阿里云函数计算
- 性能优化与常见坑位
- 问答环节:你关心的5个高频问题
为什么PHP项目需要Serverless?
传统PHP部署依赖Apache/Nginx + PHP-FPM,开发者需要管理服务器、处理安全补丁、应对突发流量,当业务增长时,手动扩容既慢又贵。Serverless(无服务器架构) 把这些问题丢给云厂商——你只需上传代码,平台自动处理弹性伸缩、冷启动、日志监控。

核心优势:
- 零运维:不用操心PHP版本、扩展安装、SSL证书。
- 按量付费:无请求时零费用,适合API、定时任务、小程序后端。
- 自动弹性:从1个并发到10000个并发,无需干预。
数据佐证:根据AWS Lambda用户报告,采用Serverless后运维成本平均下降60%-80%。
Serverless部署PHP的三种主流方案
| 方案 | 平台 | 适用场景 | 冷启动速度 | 成本 |
|---|---|---|---|---|
| Bref (PHP运行时) | AWS Lambda | 企业级、高负载 | 约500ms-2s | 中等 |
| Vercel/Netlify Functions | 边缘计算 | 轻量API、静态站点 | 约200ms | 低 |
| 阿里云函数计算(FC) | 国内合规 | 微信小程序、B2B | 约1-3s | 极低 |
选型建议:
- 面向海外用户:首选Bref + AWS Lambda,生态最完善。
- 面向国内用户:阿里云FC支持PHP runtime,零改造成本。
- 轻量级应用:Vercel的PHP支持(通过自定义runtime)适合个人项目。
案例:从零部署一个Laravel应用到阿里云函数计算
安装Serverless Devs CLI
npm install -g @serverless-devs/s s config add # 配置阿里云AK/SK
初始化PHP项目
s init start-php-web # 选择Laravel模板 cd start-php-web && composer install
修改s.yaml配置
# 关键配置段
services:
php-app:
component: devsapp/fc
props:
region: cn-hangzhou
service:
name: my-laravel-app
internetAccess: true
function:
name: web
runtime: custom.debian10
codeUri: ./
handler: index.php
# 重点:设置HTTP触发器
triggers:
- type: http
name: httpTrigger
protocols:
- http
- https
处理Laravel入口
在根目录创建bootstrap.php:
<?php
// 自动补全$_SERVER变量(FC不提供完整CGI环境)
$_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO'] ?? '/';
$_SERVER['SERVER_NAME'] = $_SERVER['HTTP_HOST'] ?? 'localhost';
require __DIR__ . '/vendor/autoload.php';
$app = require_once __DIR__ . '/bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
$response->send();
$kernel->terminate($request, $response);
部署并验证
s deploy -y # 返回公网访问地址:https://xxx.fc.aliyuncs.com
注意:阿里云FC对PHP runtime限制写入/tmp以外的目录,请配置
session和缓存路径到/tmp。
性能优化与常见坑位
🔥 冷启动优化
- 预加载扩展:在FC控制台设置
PHP_INI_SCAN_DIR加载opcache。 - Keep-alive:使用阿里云提供的keep-alive Web Server包装层。
- 预留实例:对核心API设置1-2个预启动实例(增加约¥0.1/天成本)。
⚠️ 常见坑位
- 文件系统只读:除/tmp外不可写,必须把日志文件路径改为
/tmp。 - 数据库连接池:Serverless环境每次请求可能不同IP,建议使用连接池且设置短连接超时。
- 环境变量大小限制:FC环境变量总大小不超过4KB,数据库密码等敏感信息建议使用KMS加密。
问答环节:你关心的5个高频问题
Q1: Serverless后还能用composer安装依赖吗?
A: 可以,在本地安装后,将vendor目录连同代码一起上传,部分平台(如Bref)支持在部署时自动运行composer install。
Q2: 数据库使用什么?RDS还是Redis?
A: 强烈建议使用云数据库(RDS、MongoDB、Redis),Serverless实例无法保留本地数据库,且频繁读写/tmp文件会影响性能。
Q3: 响应时间比传统服务器慢?
A: 首次请求因冷启动会慢1-3秒,后续请求(热启动)速度与普通PHP-FPM相近,可通过预留实例缓解冷启动。
Q4: 支持WebSocket吗?
A: 阿里云FC、AWS Lambda均通过API网关支持WebSocket,但需要额外配置,简单应用建议使用HTTP轮询替代。
Q5: 迁移成本高吗?
A: 如果项目使用Laravel/Symfony等现代框架,主要改动是public/index.php入口和文件路径,老旧项目(如ThinkPHP 3.2)可能需要重写文件操作逻辑。
🔍 延伸思考:Serverless是否适合所有PHP项目?
- ✅ 适合:API接口、定时任务、表单处理、小程序后端、博客系统。
- ❌ 不适合:大文件上传(限制100MB)、高实时性游戏服务、长期占用进程的任务。
选择建议:先用少量非核心API做灰度测试,确认延迟和成本符合预期后,再逐步迁移核心业务。
PHP Serverless部署已从“玩具级”进化到“生产就绪”,对于中小团队,它意味着更低的启动成本、更强的扩展能力,只要处理好文件系统和冷启动,你完全可以告别深夜改服务器配置的噩梦,从一个小接口开始,体验无服务器运维的轻盈吧。