缓存工具 / bref-laravel-bridge
Bref的高级Laravel集成,包括对Octane的支持。
Requires
- php: ^8.0
- aws/aws-sdk-php: ^3.222
- bref/bref: ^1.5
- illuminate/container: ^8.0|^9.0
- illuminate/contracts: ^8.0|^9.0
- illuminate/http: ^8.0|^9.0
- illuminate/queue: ^8.0|^9.0
- illuminate/support: ^8.0|^9.0
- laravel/octane: ^1.2
- monolog/monolog: ^2.0
- riverline/multipart-parser: ^2.0
README
Bref的高级Laravel集成,包括对Octane的支持。
此项目主要基于以下项目的代码: PHP Runtimes, Laravel Vapor 和 Bref的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_RUNTIME
和BREF_LOOP_MAX
即可。
为了避免将密钥作为环境变量设置在你的Lambda函数上,你可以直接将它们注入Lambda运行时
provider: environment: APP_SSM_PREFIX: /${self:service}-${sls:stage}/ APP_SSM_PARAMETERS: "APP_KEY, DATABASE_URL"
这将为你的服务名和阶段注入APP_KEY
和DATABASE_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