Laravel echo 没有收到事件
Laravel echo not receiving events
我正在使用 Laravel Echo 和 React Native 在我的移动应用程序中实现实时。我按照文档进行操作,但它仍然不起作用。
我使用 Redis 驱动来广播我的事件,Laravel-echo-server 用于 Socket.io 服务器,Socket.io-client 在客户端用于监听事件。
一切似乎在 Redis 方面都运行得很好,因为通过 "redis-cli monitor" 命令,事件写得很好。在 Laravel-echo-server 端,一切看起来也很好,因为当我触发事件时我的日志中有这个(所以我假设用户成功加入了频道):
[2:54:48 PM] - Eri_5PZDB5gkvShrBBBH authenticated for: private-App.User.4016
[2:54:48 PM] - Eri_5PZDB5gkvShrBBBH joined channel: private-App.User.4016
Channel: ami_database_private-App.User.4016
Event: App\Events\UpdateRequest
除了我没有在客户端触发事件并且我在 Chrome 开发控制台中没有任何内容。我还检查了 "WS" 部分中的 "Network" 选项卡,同样,没有显示任何内容。
我已经尝试了论坛不同主题提出的所有解决方案,但没有任何改变
以下是我在事件中定义频道的方式(以及我的 class 实现 ShouldBroadcast):
public function broadcastOn()
{
return new PrivateChannel('App.User.' . $this->receiver->id);
}
这是我触发事件的方式:
我正在使用来自 AWS
的 EC2 和 Elasticache
event(new UpdateRequest($receiver));
// I also tried this one
broadcast(new UpdateRequest($receiver));
这是我在laravel-echo-server.json文件中的配置
{
"authHost": "<MY_EC2_IP>:80",
"authEndpoint": "/broadcasting/auth",
"clients": [
{
"appId": "<appId>",
"key": "<key_id>"
}
],
"database": "redis",
"databaseConfig": {
"redis": {
"port": 6379,
"host": "<MY_ELASTICACHE_REDIS_ENDPOINT>"
},
"sqlite": {
"databasePath": "/database/laravel-echo-server.sqlite"
}
},
"devMode": true,
"host": null,
"port": "6001",
"protocol": "http",
"socketio": {},
"secureOptions": 67108864,
"sslCertPath": "",
"sslKeyPath": "",
"sslCertChainPath": "",
"sslPassphrase": "",
"subscribers": {
"http": true,
"redis": true
},
"apiOriginAllow": {
"allowCors": false
}
}
在客户端,以下是我在 React Native 应用程序中使用 echo 的方式:
(我将主机定义为我的 EC2 实例的 IP,因为我在上面 运行 Laravel-echo-server)
export const echo = new Echo({
broadcaster: 'socket.io',
host: `http://${MY_EC2_IP}:6001`,
client: Socketio,
auth: {
headers: {
Accept: 'application/json'
}
}
})
我在应用程序的最开始调用 echo。这样就永远不会unmount
echo.private('App.User.' + this.props.userId)
.listen('UpdateRequest', function (e) {
console.log('UpdateRequest', e)
})
编辑:
我忘了给你看 .env 文件:
BROADCAST_DRIVER=redis
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
我已经尝试过以下命令:
php artisan queue:work
php artisan queue:listen
我还尝试定义一个特定于我的事件的名称,我将 ShouldBroadcast 接口更改为 ShouldBroadcastNow,我只花了 1 小时检查 Laravel Echo 的源代码,没有任何迹象表明我的方式做事不对。
没有错误信息,没有异常,什么都没有。
拜托,我需要帮助,因为我没有想法。
此致!
我找到了解决问题的方法!
事实上,我只是没有正确查看 Laravel-echo-server 发出的日志。
[2:54:48 PM] - Eri_5PZDB5gkvShrBBBH authenticated for: private-App.User.4016
[2:54:48 PM] - Eri_5PZDB5gkvShrBBBH joined channel: private-App.User.4016
Channel: ami_database_private-App.User.4016
Event: App\Events\UpdateRequest
如果你仔细观察,我的用户加入了频道 private-App.User.4016
因为这部分是由 Laravel Echo 在客户端管理的。
但是如果我们看下面两行,我们会看到当我的事件被触发时,它发布在频道 ami_database_private-App.User.4016
上,因为这部分由 Laravel 管理并且默认添加一个前缀到 Redis 条目。
只需转到 config/database.php
文件并编辑以下代码:
'redis' => [
// ...
'options' => [
'cluster' => env('REDIS_CLUSTER', 'predis'),
'prefix' => Str::slug(env('APP_NAME', 'laravel'), '_').'_database_',
],
// ...
],
到
'redis' => [
// ...
'options' => [
'cluster' => env('REDIS_CLUSTER', 'predis'),
'prefix' => '',
],
// ...
],
这样,Laravel不在他发布事件的频道名称前加前缀,一切恢复正常!
希望对您有所帮助!
您也可以将此前缀添加为 MIX_ 环境变量,或将其添加到前端和后端项目的管道环境中,并将其附加到通道或编写名为 echoListen('channel-name') 的包装函数,其中 returns回显实例。
const echoPrivate = (channel) => {
return new Echo({
...options
}).private(process.env.MIX_CHANNEL_PREFIX + channel);
};
const echoChannel = (channel) => {
return new Echo({
...options
}).channel(process.env.MIX_CHANNEL_PREFIX + channel);
};
export {
echoPrivate,
echoChannel,
};
我正在使用 Laravel Echo 和 React Native 在我的移动应用程序中实现实时。我按照文档进行操作,但它仍然不起作用。
我使用 Redis 驱动来广播我的事件,Laravel-echo-server 用于 Socket.io 服务器,Socket.io-client 在客户端用于监听事件。
一切似乎在 Redis 方面都运行得很好,因为通过 "redis-cli monitor" 命令,事件写得很好。在 Laravel-echo-server 端,一切看起来也很好,因为当我触发事件时我的日志中有这个(所以我假设用户成功加入了频道):
[2:54:48 PM] - Eri_5PZDB5gkvShrBBBH authenticated for: private-App.User.4016
[2:54:48 PM] - Eri_5PZDB5gkvShrBBBH joined channel: private-App.User.4016
Channel: ami_database_private-App.User.4016
Event: App\Events\UpdateRequest
除了我没有在客户端触发事件并且我在 Chrome 开发控制台中没有任何内容。我还检查了 "WS" 部分中的 "Network" 选项卡,同样,没有显示任何内容。
我已经尝试了论坛不同主题提出的所有解决方案,但没有任何改变
以下是我在事件中定义频道的方式(以及我的 class 实现 ShouldBroadcast):
public function broadcastOn()
{
return new PrivateChannel('App.User.' . $this->receiver->id);
}
这是我触发事件的方式: 我正在使用来自 AWS
的 EC2 和 Elasticacheevent(new UpdateRequest($receiver));
// I also tried this one
broadcast(new UpdateRequest($receiver));
这是我在laravel-echo-server.json文件中的配置
{
"authHost": "<MY_EC2_IP>:80",
"authEndpoint": "/broadcasting/auth",
"clients": [
{
"appId": "<appId>",
"key": "<key_id>"
}
],
"database": "redis",
"databaseConfig": {
"redis": {
"port": 6379,
"host": "<MY_ELASTICACHE_REDIS_ENDPOINT>"
},
"sqlite": {
"databasePath": "/database/laravel-echo-server.sqlite"
}
},
"devMode": true,
"host": null,
"port": "6001",
"protocol": "http",
"socketio": {},
"secureOptions": 67108864,
"sslCertPath": "",
"sslKeyPath": "",
"sslCertChainPath": "",
"sslPassphrase": "",
"subscribers": {
"http": true,
"redis": true
},
"apiOriginAllow": {
"allowCors": false
}
}
在客户端,以下是我在 React Native 应用程序中使用 echo 的方式: (我将主机定义为我的 EC2 实例的 IP,因为我在上面 运行 Laravel-echo-server)
export const echo = new Echo({
broadcaster: 'socket.io',
host: `http://${MY_EC2_IP}:6001`,
client: Socketio,
auth: {
headers: {
Accept: 'application/json'
}
}
})
我在应用程序的最开始调用 echo。这样就永远不会unmount
echo.private('App.User.' + this.props.userId)
.listen('UpdateRequest', function (e) {
console.log('UpdateRequest', e)
})
编辑:
我忘了给你看 .env 文件:
BROADCAST_DRIVER=redis
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
我已经尝试过以下命令:
php artisan queue:work
php artisan queue:listen
我还尝试定义一个特定于我的事件的名称,我将 ShouldBroadcast 接口更改为 ShouldBroadcastNow,我只花了 1 小时检查 Laravel Echo 的源代码,没有任何迹象表明我的方式做事不对。
没有错误信息,没有异常,什么都没有。
拜托,我需要帮助,因为我没有想法。
此致!
我找到了解决问题的方法!
事实上,我只是没有正确查看 Laravel-echo-server 发出的日志。
[2:54:48 PM] - Eri_5PZDB5gkvShrBBBH authenticated for: private-App.User.4016
[2:54:48 PM] - Eri_5PZDB5gkvShrBBBH joined channel: private-App.User.4016
Channel: ami_database_private-App.User.4016
Event: App\Events\UpdateRequest
如果你仔细观察,我的用户加入了频道 private-App.User.4016
因为这部分是由 Laravel Echo 在客户端管理的。
但是如果我们看下面两行,我们会看到当我的事件被触发时,它发布在频道 ami_database_private-App.User.4016
上,因为这部分由 Laravel 管理并且默认添加一个前缀到 Redis 条目。
只需转到 config/database.php
文件并编辑以下代码:
'redis' => [
// ...
'options' => [
'cluster' => env('REDIS_CLUSTER', 'predis'),
'prefix' => Str::slug(env('APP_NAME', 'laravel'), '_').'_database_',
],
// ...
],
到
'redis' => [
// ...
'options' => [
'cluster' => env('REDIS_CLUSTER', 'predis'),
'prefix' => '',
],
// ...
],
这样,Laravel不在他发布事件的频道名称前加前缀,一切恢复正常!
希望对您有所帮助!
您也可以将此前缀添加为 MIX_ 环境变量,或将其添加到前端和后端项目的管道环境中,并将其附加到通道或编写名为 echoListen('channel-name') 的包装函数,其中 returns回显实例。
const echoPrivate = (channel) => {
return new Echo({
...options
}).private(process.env.MIX_CHANNEL_PREFIX + channel);
};
const echoChannel = (channel) => {
return new Echo({
...options
}).channel(process.env.MIX_CHANNEL_PREFIX + channel);
};
export {
echoPrivate,
echoChannel,
};