Laravel Websockets事件未触发。

3
我已经在本地环境中实现了Laravel Websockets和Echo,一切都正常工作,但是当部署到生产环境时,似乎可以建立连接并订阅频道,但事件不会触发。 我对自己做错了什么毫无头绪。
这是我的设置:
.env文件:
BROADCAST_DRIVER=pusher
PUSHER_APP_ID=someID
PUSHER_APP_KEY=someKey
PUSHER_APP_SECRET=someSecret
PUSHER_APP_CLUSTER=eu
PUSHER_SCHEME=http
PUSHER_USE_SSL=false

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
MIX_PUSHER_USE_SSL=true
MIX_PUSHER_HOST=mydomain.com
MIX_PUSHER_PORT=443

"Echo" 配置:
window.Echo = new Echo({
  broadcaster: 'pusher',
  key: process.env.MIX_PUSHER_APP_KEY,
  cluster: process.env.MIX_PUSHER_APP_CLUSTER,
  wsHost: process.env.MIX_PUSHER_HOST,
  wsPort: process.env.MIX_PUSHER_PORT,
  forceTLS: process.env.MIX_PUSHER_USE_SSL === true || process.env.MIX_PUSHER_USE_SSL === 'true',
  disableStats: true,
});

nginx 配置:
location /app/ {
    proxy_pass http://127.0.0.1:6001/app/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $host;
}

location /apps/ {
    proxy_pass http://127.0.0.1:6001/apps/;
    proxy_set_header Host $host;
}

这是为了建立一个反向代理,以便能够使用我的网站SSL。
在websockets仪表板上,路径为/laravel-websockets,我能够通过443端口连接,并且我可以看到它已经订阅了我的频道。其中,websockets.php和broadcasting.php的所有默认值都被保留。

websockets subscribed to channels

当事件被触发时,我期望看到的是类似于我在本地环境中看到的这样的东西:

websockets api-message

但是这并没有在生产中出现。好像它可以订阅频道,但不能捕获api-message事件。
这是我第一次实现Websockets,所以有点迷失。有人看到我做错了什么吗?
2个回答

4

明白了,我搞清楚了!

我没有意识到,但这很合理,就是这些API消息被广播时是排队的。如果您的队列没有正确消耗,您将永远看不到它们。

在我的本地环境中,我使用了Laravel的sync队列驱动程序,所以它在本地工作正常,但由于配置错误,在生产中我的RabbitMQ队列未被正确消耗。

一旦我修复了这个问题,一切都按预期开始工作:)

无论如何,也许我问题中列出的配置能够帮助其他试图弄清楚如何做到这一点的人。


2
救命稻草。谢谢! 我一直在想为什么事件没有被触发。感谢您的帖子,我去检查了Telescope中的Jobs页面。所有事件都排队等待,并显示为“pending”状态,因此从未广播。 为了立即广播事件而不将它们排队,我将我的事件类接口实现从:class MyEvent implements ShouldBroadcast {}改为:class MyEvent implements ShouldBroadcastNow {}问题解决了。 - Blue Squirrel
我没有启动队列进程,这让我疯狂,我不知道它与此有关。谢谢。 - ufk
@chris,你已经给QUEUE_CONNECTION分配了什么?现在我把QUEUE_CONNECTION设置为sync。 - kamran
1
@kamran 在生产环境中,我使用 rabbitmq 来处理我的队列,因此它被设置为默认选项。您需要安装 vladimir-yuldashev/laravel-queue-rabbitmq 包才能使用 rabbitmq。 - Chris

0
也许你忘记将BROADCAST_DRIVER=log替换为BROADCAST_DRIVER=pusher,然后运行php artisan optimize:clear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接