georgeboot / laravel-echo-api-gateway
使用Laravel Echo与API Gateway Websockets
Requires
- php: ^8.0|^8.1|^8.2
- ext-json: *
- aws/aws-sdk-php: ^3.308
- bref/bref: ^1.1
- guzzlehttp/guzzle: ^6.3|^7.0
- laravel/framework: ^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- mockery/mockery: ^1.2
- nunomaduro/larastan: ^2.5
- orchestra/testbench: ^7.33.0
- pestphp/pest: ^1.0
- phpunit/phpunit: ^8.0|^9.0
README
不再维护!!!
目前我没有时间维护这个包。
我的建议是使用Soketi无服务器:[https://renoki-25232877.hubspotpagebuilder.eu/soketi-serverless](https://renoki-25232877.hubspotpagebuilder.eu/soketi-serverless)
基本上免费使用,构建得很好。
这个包允许你将API Gateway的Websockets用作Laravel Echo的驱动,因此你不必使用像Pusher或Socket.io这样的服务。
它通过在API Gateway中设置一个WebSocket API,并在每次向WebSocket发送消息时调用一个Lambda函数来实现。此包包括并自动配置了一个处理程序来响应这些WebSocket消息。我们还配置Laravel使用此连接作为广播驱动程序。
尽管后者需要一些手动设置,但此包目前仅适用于Bref或Laravel Vapor。
一旦发布1.0版本,此包将适用于生产工作负载。在此之前,建议仅将此包用于非关键/非生产项目。
需求
为了使用此包,你的项目需要满足以下条件
- PHP 7.4或8.x
- Laravel 6、7或8
- 使用bref或Laravel Vapor部署到AWS
- 有一个正常工作的队列
- 使用Laravel Mix或任何其他工具打包你的资产
安装
安装此包相当简单。
首先,我们必须安装composer和npm包
composer require georgeboot/laravel-echo-api-gateway
yarn add laravel-echo-api-gateway
# or
npm install --save-dev laravel-echo-api-gateway
特定平台说明
A. 使用Bref
接下来,当使用Bref时,我们必须在我们的serverless.yml
文件中添加一些元素。如果使用Vapor,则必须使用AWS CLI或控制台手动创建这些资源。
添加一个新函数来处理WebSocket事件(消息等)
functions: # Add this function websocket: handler: handlers/websocket.php layers: - ${bref:layer.php-80} events: - websocket: $disconnect - websocket: $default
添加一个资源来创建和配置我们的DynamoDB表,其中连接将被存储
resources: Resources: # Add this resource ConnectionsTable: Type: AWS::DynamoDB::Table Properties: TableName: connections AttributeDefinitions: - AttributeName: connectionId AttributeType: S - AttributeName: channel AttributeType: S KeySchema: - AttributeName: connectionId KeyType: HASH - AttributeName: channel KeyType: RANGE GlobalSecondaryIndexes: - IndexName: lookup-by-channel KeySchema: - AttributeName: channel KeyType: HASH Projection: ProjectionType: ALL - IndexName: lookup-by-connection KeySchema: - AttributeName: connectionId KeyType: HASH Projection: ProjectionType: ALL BillingMode: PAY_PER_REQUEST
添加以下iamRoleStatement
以启用我们的Lambda函数访问表
provider: name: aws iamRoleStatements: # Add this iamRoleStatement - Effect: Allow Action: [ dynamodb:Query, dynamodb:GetItem, dynamodb:PutItem, dynamodb:UpdateItem, dynamodb:DeleteItem, dynamodb:BatchWriteItem ] Resource: - !GetAtt ConnectionsTable.Arn - !Join [ '', [ !GetAtt ConnectionsTable.Arn, '/index/*' ] ]
添加一个环境变量来自动生成我们的WebSocket URL
provider: name: aws environment: # Add these variables BROADCAST_DRIVER: laravel-echo-api-gateway LARAVEL_ECHO_API_GATEWAY_DYNAMODB_TABLE: !Ref ConnectionsTable LARAVEL_ECHO_API_GATEWAY_API_ID: !Ref WebsocketsApi LARAVEL_ECHO_API_GATEWAY_API_STAGE: "${self:provider.stage}"
接下来,在handlers/websocket.php
中创建PHP处理程序文件
<?php use Georgeboot\LaravelEchoApiGateway\Handler; use Illuminate\Foundation\Application; require __DIR__ . '/../vendor/autoload.php'; /** @var Application $app */ $app = require __DIR__ . '/../bootstrap/app.php'; $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class); $kernel->bootstrap(); return $app->make(Handler::class);
现在,通过运行serverless deploy
或类似的命令来部署您的应用程序。记下输出给出的WebSocket URL。
B. 使用Vapor
当使用Vapor时,您必须使用AWS CLI或控制台手动创建这些必需的资源。
B1. 连接的DynamoDB表
为连接创建一个DynamoDB表。使用connectionId
(字符串)作为HASH键,使用channel
(字符串)作为SORT键。将容量设置设置为任何您喜欢的(可能是在需求模式下)。
创建2个索引
- 名称:
lookup-by-connection
,键:connectionId
,无排序键,投影:所有 - 名称:
lookup-by-channel
,键:channel
,无排序键,投影:所有
B2. API Gateway
创建一个新的Websocket API。输入名称,并保留路由选择表达式为默认值。添加 $disconnect
和 $default
。将两个集成都设置为 Lambda
,并从列表中选择您的CLI lambda。设置阶段名称为您想要的名称,并创建API。创建后,记下ID,因为我们稍后需要它。
B3. IAM权限
在IAM中,转到角色并打开 laravel-vapor-role
。打开内联策略并编辑它。在JSON选项卡上,将 "execute-api:*"
添加到操作列表中。
然后,登录到 Laravel Vapor,转到团队设置,AWS账户,点击正确账户旁边的角色并取消选择“接收更新”。
编辑您的 .env
BROADCAST_DRIVER=laravel-echo-api-gateway LARAVEL_ECHO_API_GATEWAY_DYNAMODB_TABLE=the-table-name-you-entered-when-creating-it LARAVEL_ECHO_API_GATEWAY_API_ID=your-websocket-api-id LARAVEL_ECHO_API_GATEWAY_API_STAGE=your-api-stage-name
生成前端代码
添加到您的javascript文件
import Echo from 'laravel-echo'; import {broadcaster} from 'laravel-echo-api-gateway'; window.Echo = new Echo({ broadcaster, // replace the placeholders host: 'wss://{api-ip}.execute-api.{region}.amazonaws.com/{stage}', });
最后,您需要通过运行Laravel Mix来生成您的资源。完成此步骤后,您应该可以正常运行了。