Laravel echo 不接收事件

bjo*_*nov 2 php websocket laravel react-native laravel-echo

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

除了我没有在客户端触发事件并且我在 Chrome 开发控制台中没有任何内容。我还检查了“WS”部分中的“网络”选项卡,同样没有显示任何内容。

我已经尝试了针对论坛不同主题提出的所有解决方案,但没有任何改变

以下是我在事件中定义频道的方式(我的班级实现了 ShouldBroadcast):

[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
Run Code Online (Sandbox Code Playgroud)

这就是我触发事件的方式:我正在使用 AWS 的 EC2 和 Elasticache

public function broadcastOn()
{
    return new PrivateChannel('App.User.' . $this->receiver->id);
}
Run Code Online (Sandbox Code Playgroud)

这是我在 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
    }
}
Run Code Online (Sandbox Code Playgroud)

在客户端,以下是我在 React Native 应用程序中使用 echo 的方法:(我将主机定义为我的 EC2 实例的 IP,因为我在其上运行 Laravel-echo-server)

event(new UpdateRequest($receiver));

// I also tried this one
broadcast(new UpdateRequest($receiver));
Run Code Online (Sandbox Code Playgroud)

我在应用程序的一开始就调用了 echo。这样,它永远不会卸载

{
    "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
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:


我忘了给你看 .env 文件:

BROADCAST_DRIVER=redis
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
Run Code Online (Sandbox Code Playgroud)

我已经尝试过以下命令:

export const echo = new Echo({
      broadcaster: 'socket.io',
      host: `http://${MY_EC2_IP}:6001`,
      client: Socketio,
      auth: {
        headers: {
          Accept: 'application/json'
        }
      }
})
Run Code Online (Sandbox Code Playgroud)

我还尝试为我的事件定义一个特定的名称,我将 ShouldBroadcast 接口更改为 ShouldBroadcastNow,我只花了 1 小时检查 Laravel Echo 的源代码,没有任何迹象表明我的做事方式是错误的。

没有错误信息,没有异常,什么都没有。

拜托,我需要帮助,因为我没有想法。

问候 !

bjo*_*nov 6

我找到了解决我的问题的方法!

事实上,我只是没有正确查看 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
Run Code Online (Sandbox Code Playgroud)

如果你仔细观察,我的用户加入了频道,private-App.User.4016因为这部分是由 Laravel Echo 在客户端管理的。

但是如果我们看下面两行,我们会看到当我的事件被触发时,它会发布在通道上,ami_database_private-App.User.4016因为这部分由 Laravel 管理,并且默认情况下会为 Redis 条目添加前缀。

只需转到该config/database.php文件并编辑以下代码:

[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
Run Code Online (Sandbox Code Playgroud)

'redis' => [

        // ...

        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'predis'),
            'prefix' => Str::slug(env('APP_NAME', 'laravel'), '_').'_database_',
        ],

        // ...

    ],
Run Code Online (Sandbox Code Playgroud)

这样,Laravel 就不会在发布事件的频道名称前加上前缀,一切都会恢复正常!

希望能帮助到你 !