PHP 怎么PHP 无服务器

wen PHP项目 2

本文目录导读:

PHP 怎么PHP 无服务器

  1. 什么是PHP无服务器架构
  2. PHP无服务器的实现方式
  3. 实用示例:图片处理API
  4. 常用工具和框架
  5. 最佳实践
  6. 部署流程
  7. 注意事项
  8. 适合使用无服务器的场景

我来帮你了解如何在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. 无状态:函数执行完毕后不保存状态
  2. 冷启动:首次调用可能较慢(1-3秒)
  3. 超时限制:通常最大15分钟(AWS Lambda)
  4. 内存限制:最大10240 MB
  5. 临时存储:/tmp 目录最多512MB

适合使用无服务器的场景

  • ✅ API 网关
  • ✅ 图片/视频处理
  • ✅ 数据ETL任务
  • ✅ Webhook处理
  • ❌ 长连接应用
  • ❌ 实时通信

开始你的PHP无服务器之旅吧!选择最适合你需求的平台开始尝试。

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