本文目录导读:

我来帮你了解如何在PHP中实现无服务器(Serverless)架构。
什么是PHP无服务器架构
无服务器不是真的没有服务器,而是开发者不用管理服务器基础设施,只需关注代码本身。
PHP无服务器的实现方式
AWS Lambda + PHP
最流行的方法,通过自定义运行时支持PHP:
准备工作:
# 安装Bref(AWS Lambda PHP运行时) composer require bref/bref # 初始化项目 vendor/bin/bref init
示例代码:
<?php
// index.php
require __DIR__ . '/vendor/autoload.php';
return function ($event, $context) {
$name = $event['queryStringParameters']['name'] ?? 'World';
return [
'statusCode' => 200,
'body' => json_encode(['message' => "Hello, $name!"]),
'headers' => ['Content-Type' => 'application/json']
];
};
serverless.yml 配置:
service: my-php-app
provider:
name: aws
runtime: provided.al2
plugins:
- ./vendor/bref/bref
functions:
api:
handler: index.php
events:
- httpApi: 'GET /hello'
Vercel 部署 PHP
Vercel 原生支持 PHP:
vercel.json:
{
"functions": {
"api/*.php": {
"runtime": "vercel-php@0.6.0"
}
}
}
api/hello.php:
<?php
header('Content-Type: application/json');
echo json_encode(['message' => 'Hello from Serverless PHP!']);
阿里云函数计算
<?php
// 阿里云函数计算 PHP 示例
function handler($event, $context) {
$eventObj = json_decode($event, true);
return [
'statusCode' => 200,
'headers' => ['Content-Type' => 'application/json'],
'body' => json_encode([
'message' => 'Hello from Alibaba Cloud Function Compute',
'input' => $eventObj
])
];
}
实用示例:图片处理API
<?php
// resize-image.php - 无服务器图片缩放
use Aws\S3\S3Client;
use Intervention\Image\ImageManagerStatic as Image;
function handler($event, $context) {
try {
$imageUrl = $event['queryStringParameters']['url'];
$width = $event['queryStringParameters']['w'] ?? 300;
$height = $event['queryStringParameters']['h'] ?? 200;
// 获取远程图片
$imageData = file_get_contents($imageUrl);
$image = Image::make($imageData);
// 调整大小
$image->resize($width, $height, function ($constraint) {
$constraint->aspectRatio();
});
// 返回处理后的图片
return [
'statusCode' => 200,
'headers' => ['Content-Type' => 'image/jpeg'],
'body' => base64_encode($image->encode('jpg')),
'isBase64Encoded' => true
];
} catch (Exception $e) {
return [
'statusCode' => 500,
'body' => json_encode(['error' => $e->getMessage()])
];
}
}
常用工具和框架
Bref (PHP for AWS Lambda)
composer require bref/bref bref/extra-php-extensions
Laravel Vapor
composer create-project laravel/laravel # 配置 vapor.yml composer require laravel/vapor-core
Bref WordPress
WordPress 也可以跑在无服务器上:
composer require bref/wordpress
最佳实践
冷启动优化
<?php
// 使用全局变量缓存连接
$redis = null;
function getRedis() {
global $redis;
if ($redis === null) {
$redis = new Redis();
$redis->connect('localhost', 6379);
}
return $redis;
}
function handler($event, $context) {
$redis = getRedis();
// 使用缓存的连接
}
环境变量管理
# serverless.yml
provider:
environment:
DB_HOST: ${env:DB_HOST}
DB_NAME: ${env:DB_NAME}
APP_ENV: production
日志记录
<?php
function handler($event, $context) {
// 结构化日志
error_log(json_encode([
'request_id' => $context->getAwsRequestId(),
'ip' => $event['requestContext']['http']['sourceIp'],
'path' => $event['rawPath']
]));
// 业务逻辑...
}
部署流程
# 1. 安装依赖 composer install --no-dev # 2. 构建部署包 serverless package # 3. 部署 serverless deploy # 4. 调用测试 serverless invoke --function hello # 5. 查看日志 serverless logs --function hello --tail
注意事项
- 无状态:函数执行完毕后不保存状态
- 冷启动:首次调用可能较慢(1-3秒)
- 超时限制:通常最大15分钟(AWS Lambda)
- 内存限制:最大10240 MB
- 临时存储:/tmp 目录最多512MB
适合使用无服务器的场景
- ✅ API 网关
- ✅ 图片/视频处理
- ✅ 数据ETL任务
- ✅ Webhook处理
- ❌ 长连接应用
- ❌ 实时通信
开始你的PHP无服务器之旅吧!选择最适合你需求的平台开始尝试。