一个简单的 Serverless PHP 应用示例,使用 Serverless Framework 和 Bref 部署
·
安装 Serverless Framework
npm install -g serverless
安装 PHP 依赖
composer install
配置 AWS CLI
aws configure
或者设置环境变量
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
部署应用
serverless deploy
部署成功后会显示 API 端点,例如:
https://xxxxx.execute-api.us-east-1.amazonaws.com
基本请求
curl https://your-api-endpoint.amazonaws.com/
带参数请求
curl “https://your-api-endpoint.amazonaws.com/?name=66666”
curl “https://your-api-endpoint.amazonaws.com/hello?name=World”
使用 Serverless Framework 本地调用
serverless invoke local -f hello
或使用 Bref 本地测试
vendor/bin/bref local hello.php
查看函数日志
serverless logs -f api
实时查看日志
serverless logs -f api --tail
删除部署的资源
serverless remove
Bref 是一个专门为 PHP 设计的 Serverless 框架,它提供:
- PHP 运行时层 (runtime layers)
- 与 Serverless Framework 的集成
- 对 AWS Lambda 的原生支持
如何修改 PHP 版本?
A: 在serverless.yml中修改 layer 版本,如${bref:layer.php-82}。
Q: 函数超时怎么办?
A: 在 serverless.yml 中添加 timeout: 30 配置。
composer.json
{
"name": "demo/serverless-php",
"description": "Simple Serverless PHP demo application",
"type": "project",
"require": {
"php": "^8.1",
"bref/bref": "^2.0"
},
"require-dev": {
"symfony/var-dumper": "^6.0"
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"config": {
"optimize-autoloader": true
}
}
运行
composer install
composer update
hello.php
简单的 GET 请求处理,演示基本功能
<?php
require __DIR__ . '/vendor/autoload.php';
return function ($event) {
$name = $event['queryStringParameters']['name'] ?? 'Serverless PHP';
return [
'statusCode' => 200,
'headers' => [
'Content-Type' => 'application/json',
],
'body' => json_encode([
'message' => "Hello from {$name}!",
'event' => 'AWS Lambda',
'runtime' => 'PHP ' . PHP_VERSION,
'timestamp' => time()
], JSON_PRETTY_PRINT)
];
};
index.php
处理所有 HTTP 请求,返回 JSON 响应
<?php
require __DIR__ . '/vendor/autoload.php';
use Bref\Context\Context;
use Bref\Event\Http\HttpRequestEvent;
use Bref\Event\Http\HttpResponse;
return function (HttpRequestEvent $event, Context $context) {
$method = $event->getMethod();
$path = $event->getPath();
$queryParams = $event->getQueryParameters();
$name = $queryParams['name'] ?? 'World';
$response = [
'message' => "Hello, {$name}!",
'path' => $path,
'method' => $method,
'timestamp' => date('Y-m-d H:i:s'),
'requestId' => $context->getAwsRequestId()
];
return new HttpResponse(
json_encode($response, JSON_PRETTY_PRINT),
[
'Content-Type' => 'application/json',
]
);
};
serverless.yml
service: serverless-php-demo
provider:
name: aws
region: us-east-1
runtime: provided.al2
plugins:
- ./vendor/bref/bref
functions:
api:
handler: index.php
description: 'Simple PHP API endpoint'
layers:
- ${bref:layer.php-81-fpm}
events:
- httpApi: '*'
hello:
handler: hello.php
description: 'Simple hello world function'
layers:
- ${bref:layer.php-81}
events:
- httpApi:
path: /hello
method: get
package:
patterns:
- '!node_modules/**'
- '!tests/**'
更多推荐
所有评论(0)