缓存工具/bref-laravel-bridge

Bref的高级Laravel集成,包括对Octane的支持。

v0.3.0 2022-11-15 21:40 UTC

This package is auto-updated.

Last update: 2024-09-09 20:19:38 UTC


README

Bref的高级Laravel集成,包括对Octane的支持。

此项目主要基于以下项目的代码: PHP RuntimesLaravel VaporBref的Laravel桥接器

背景

为什么会有这个项目,为什么不直接使用Laravel Vapor?Vapor很棒,使用简单,是更好的选择,它的$399/年的费用足以抵消维护自己的基础设施的成本。

然而,对于Relay的API,我们需要一个1) 开源 (Vapor的API是一个黑盒),2) 安全 (Vapor有对数据库和环境变量的管理权限)并且3) 不受支持团队(Vapor没有企业支持)支配的东西。我们也不想被迫在Cloudflare之上使用CloudFront,但这只是个人的偏好。

我们需要一个开源的解决方案,它能给我们更多的控制,并且是安全的。

Bref + Serverless Framework正是这样的解决方案,然而Bref的Laravel集成相当基础,它很容易暴露SSM密钥,并且不支持Laravel Octane。

因此,我们创建了它。

安装

首先,请确保熟悉Bref及其无服务器Laravel应用程序指南

接下来,安装包并发布自定义Bref运行时

composer require cachewerk/bref-laravel-bridge

php artisan vendor:publish --tag=bref-runtime

默认情况下,运行时被发布到php/,其中包含Bref的PHP配置,但可以移动到任何位置。

接下来,我们需要在serverless.yml中设置AWS_ACCOUNT_ID环境变量

provider:
  environment:
    AWS_ACCOUNT_ID: ${aws:accountId}

然后设置你的函数

functions:
  web:
    handler: php/runtime.php
    environment:
      APP_RUNTIME: octane
      BREF_LOOP_MAX: 250
    layers:
      - ${bref:layer.php-81}
    events:
      - httpApi: '*'

  queue:
    handler: php/runtime.php
    timeout: 59
    environment:
      APP_RUNTIME: queue
    layers:
      - ${bref:layer.php-81}
    events:
      - sqs:
          arn: !GetAtt Queue.Arn
          batchSize: 1
          maximumBatchingWindow: 60

  cli:
    handler: php/runtime.php
    timeout: 720
    environment:
      APP_RUNTIME: cli
    layers:
      - ${bref:layer.php-81}
      - ${bref:layer.console}
    events:
      - schedule:
          rate: rate(1 minute)
          input: '"schedule:run"'

如果你不想使用Octane,只需从web函数中移除APP_RUNTIMEBREF_LOOP_MAX即可。

为了避免将密钥作为环境变量设置在你的Lambda函数上,你可以直接将它们注入Lambda运行时

provider:
  environment:
    APP_SSM_PREFIX: /${self:service}-${sls:stage}/
    APP_SSM_PARAMETERS: "APP_KEY, DATABASE_URL"

这将为你的服务名和阶段注入APP_KEYDATABASE_URL,例如从/myapp-staging/APP_KEY

最后,部署你的应用程序

sls deploy --stage=staging

查看更多示例

配置

服务静态资源

如果你想从应用程序的public目录中服务一些静态资源,你可以使用ServeStaticAssets中间件。

首先,发布配置

php artisan vendor:publish --tag=bref-config

然后在bref.assets中定义你想要服务的文件。

最后,告诉Bref在web函数上支持二进制响应

functions:
  web:
    handler: php/runtime.php
    environment:
      BREF_BINARY_RESPONSES: 1

持久化数据库会话

如果你正在使用PostgreSQL 9.6或更高版本,你可以利用持久化数据库会话。

首先,在RDS数据库的参数组或特定数据库上设置idle_in_transaction_session_timeout

ALTER DATABASE SET idle_in_transaction_session_timeout = '10000' -- 10 seconds in ms

最后,设置OCTANE_PERSIST_DATABASE_SESSIONS环境变量。

functions:
  web:
    handler: php/runtime.php
    environment:
      APP_RUNTIME: octane
      BREF_LOOP_MAX: 250
      OCTANE_PERSIST_DATABASE_SESSIONS: 1

使用

Artisan控制台

就像Bref一样,你可以执行控制台命令

vendor/bin/bref cli <service>-<stage>-cli -- route:list

vendor/bin/bref cli example-staging-cli -- route:list

维护模式

类似于 php artisan down 命令,您可以将您的应用程序设置为维护模式。所需的所有操作仅是设置 MAINTENANCE_MODE 环境变量

provider:
  environment:
    MAINTENANCE_MODE: ${param:maintenance, null}

这样,您就可以快速将所有功能置于维护模式,而无需运行完整构建和 CloudFormation 部署

serverless deploy function --function=web --update-config --param="maintenance=1"
serverless deploy function --function=cli --update-config --param="maintenance=1"
serverless deploy function --function=queue --update-config --param="maintenance=1"

要从维护模式中移除应用程序,只需省略该参数即可

serverless deploy function --function=web --update-config
serverless deploy function --function=cli --update-config
serverless deploy function --function=queue --update-config

关于 --update-config 标志的一个注意事项是,它不会更新 serverless.yml 文件中 environment 变量中的对象

provider:
  environment:
    SQS_QUEUE: ${self:service}-${sls:stage}    # good
    SQS_QUEUE: !Ref QueueName                  # bad
    SQS_QUEUE:                                 # bad
      Ref: QueueName