有一天,我意识到我的web套接字不能在我的生产Apache服务器上工作。所以,我试着调试那里,发现没有什么问题,队列正在工作,套接字客户端正在连接,但没有在客户端接收任何东西。
如何?-不知道从什么时候开始?-不知道
所以,我决定在我的本地环境中测试它,就像我在部署之前所做的那样。
我使用laravel-websockets实现web套接字。
我使用下面的Vue.js代码来调试我的套接字连接:
import Echo from "laravel-echo";
import Pusher from "pusher-js";
window.Pusher = Pusher;
const token = "44|yiPuLJM1DviFgX7Aq6cZPam86eyQMYoNssZQs2gl"
const tenant = "test"
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'laravel_rdb',
wsHost: '127.0.0.1',
authEndpoint: 'http://localhost/myapp/public/broadcasting/auth',
encrypted: false,
forceTLS: false,
wsPort: 6001,
wssPort:6001,
disableStats: true,
enabledTransports: ['ws', 'wss'],
auth : {
headers : {
Authorization: "Bearer " + token,
Accept: "application/json",
'X-Tenant': tenant,
}
},
})
window.Echo.private(tenant + '.notifications.user.1')
.listen('NotifyUser', (e) => {
console.log(e)
})
window.Echo.connector.pusher.connection.bind('state_change', (state) => {
console.log('Debug - Current connection state: ' + state.current);
if (window.Echo.websocketsState !== '' && state.current === 'connected') {
console.log("Status Update: " + state.current);
} else if (window.Echo.websocketsState !== '' && state.current === 'failed') {
window.Echo.reconnectInterval = window.setInterval(() => {
var ifConnected = window.navigator.onLine;
if (ifConnected) {
clearInterval(window.Echo.reconnectInterval);
console.log("Status Update 2: " + state.current);
}
}, 3000);
}
window.Echo.websocketsState = state.current;
});
使用这段代码,我可以看到web套接字连接成功,但控制台没有显示任何关于我的发送消息。
我正在使用数据库队列来处理套接字消息,使用php artisan queue:work
,我可以看到我的广播队列正在被处理。
我也测试了web sockets仪表板。当我启动Vue.js代码时,我可以看到我的频道已订阅,但当我尝试从仪表板向该频道发送事件消息时,它什么也不做。没有错误,没有警报,什么都没有。
我没有做任何改变我的web套接字代码。同样的代码工作得很好,没有任何问题,但它突然停止工作,最令人沮丧的是根本没有错误。
我猜唯一可能的错误导致因素是,与一些依赖包或Laravel框架本身的兼容性问题,因为我定期更新它们。自从我检查web套接字以来已经很长时间了,所以我不确定是什么原因导致了这个问题。
问题和解决方案已经解释在这里:https://github.com/beyondcode/laravel-websockets/issues/1041