返回

Laravel 中 Pusher 广播问题:原因和解决方案

php

在 Laravel 中修复 Pusher 广播问题

引言

在使用 Laravel 构建实时应用程序时,Pusher 是一个受欢迎的广播驱动程序。然而,有时 Pusher 的配置可能会导致一些问题。本文将深入探讨 Laravel 中 Pusher 广播问题的常见原因和解决方案。

问题

用户在使用 Pusher 作为广播驱动程序时可能遇到的一个常见问题是,消息被发送到 pusher.com 而不是本地主机 127.0.0.1。这表明 Pusher 的配置不正确。

解决方法

配置验证

首先,检查 config/broadcasting.php 文件中 pusher 选项的配置。确保以下设置正确:

  • cluster:Pusher 集群名称
  • host:127.0.0.1
  • port:Pusher 端口号
  • scheme:http 或 https
  • encrypted:如果启用 TLS,则为 true

清除缓存

清除 Laravel 缓存,以确保读取最新的配置:

php artisan cache:clear

服务器重启

重新启动 Laravel 服务器以应用更改:

php artisan serve

事件类检查

确保事件类正确实现 ShouldBroadcast 接口,并指定要广播到的频道:

class UserStatusEvent implements ShouldBroadcast
{
    public function broadcastOn()
    {
        return new PresenceChannel('status-update');
    }
}

.env 文件检查

检查 .env 文件中的 Pusher 配置设置:

PUSHER_APP_ID=...
PUSHER_APP_KEY=...
PUSHER_APP_SECRET=...
PUSHER_APP_CLUSTER=...

JavaScript 配置检查

在 JavaScript 配置中,确保 PusherEcho 实例已正确初始化,并且使用了正确的 Pusher 凭据和选项:

import Echo from 'laravel-echo';

import Pusher from 'pusher-js';
window.Pusher = Pusher;

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: import.meta.env.VITE_PUSHER_APP_KEY,
    cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER ?? 'mt1',
    wsHost: import.meta.env.VITE_PUSHER_HOST ? import.meta.env.VITE_PUSHER_HOST : `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`,
    wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80,
    wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443,
    forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https',
    enabledTransports: ['ws', 'wss'],
});

网络配置

确保服务器允许传入的 WebSocket 连接。如果服务器位于防火墙后面,需要打开相应的端口。

证书检查

如果使用 TLS,请确保 Pusher 证书已正确安装在服务器上。

常见问题解答

Q1:为什么我的消息没有发送到本地主机?
A1:请检查 Pusher 配置是否正确,特别是 hostport 设置。

Q2:我收到 "Pusher:未授权" 错误。该怎么办?
A2:确保 Pusher 凭据(app_idapp_keyapp_secret)已正确设置。

Q3:我的 JavaScript 配置中应该使用什么 cluster 值?
A3:cluster 值应与 Pusher 仪表板中显示的值相匹配。

Q4:如何启用 TLS?
A4:在 config/broadcasting.php 中将 encrypted 选项设置为 true,并确保服务器具有有效的 TLS 证书。

Q5:为什么我的 WebSocket 连接未成功?
A5:请检查网络配置并确保服务器允许传入的 WebSocket 连接。

总结

遵循这些步骤可以帮助你解决 Laravel 中 Pusher 广播问题的根源。通过仔细检查配置、重启服务器和核查连接,你可以确保 Pusher 正常运行并实现无缝的实时通信。