安装 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/**'

更多推荐