You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel广播异常:laravel-echo-server/Redis不定期停止处理事件

Laravel Echo Server 不定期断开连接问题排查与解决

问题场景

使用Redis驱动配合laravel-echo-server实现广播功能,初始运行正常,但会不定期(3-6小时或每日一次)自动断开连接,laravel-echo-server保持后台运行,刷新页面后功能恢复。

相关配置

.env 文件

BROADCAST_DRIVER=redis
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
LARAVEL_ECHO_PORT=6001

laravel-echo-server.js 配置

{
     "authHost": "http://localhost",
     "authEndpoint": "/broadcasting/auth",
     "clients": [],
     "database": "redis",
     "databaseConfig": {
         "redis": {},
        "sqlite": {
        "databasePath": "/database/laravel-echo-server.sqlite"
        }
     },
     "devMode": false,
     "host": null,
     "port": "6001",
     "protocol": "http",
     "socketio": {},
     "secureOptions": 67108864,
     "sslCertPath": "",
     "sslKeyPath": "",
     "sslCertChainPath": "",
     "sslPassphrase": "",
     "subscribers": {
    "http": true,
    "redis": true
     },
     "apiOriginAllow": {
    "allowCors": false,
    "allowOrigin": "",
    "allowMethods": "",
    "allowHeaders": ""
    }
}

laravel-echo-setup.js 前端配置

import Echo from 'laravel-echo';
window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ":" + window.laravel_echo_port,
    enabledTransports: ['ws', 'wss'],
    disableStats: true,
    forceTLS: false,
    transports: ['websocket', 'polling', 'flashsocket'] 
});

解决方案

1. 配置前端自动重连机制

当前前端Echo实例未明确配置重连参数,显式添加重连配置确保稳定性:

import Echo from 'laravel-echo';
window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ":" + window.laravel_echo_port,
    enabledTransports: ['ws', 'wss'],
    disableStats: true,
    forceTLS: false,
    transports: ['websocket', 'polling'],
    // 新增重连配置
    reconnection: true,
    reconnectionAttempts: 10,
    reconnectionDelay: 1000,
    reconnectionDelayMax: 5000
});

// 监听重连事件辅助排查
window.Echo.connector.socket.on('reconnect', (attemptNumber) => {
    console.log(`WebSocket 重连成功,第 ${attemptNumber} 次尝试`);
});

window.Echo.connector.socket.on('reconnect_failed', () => {
    console.error('WebSocket 重连失败,建议刷新页面');
});

2. 优化Redis连接配置

laravel-echo-server的Redis配置未指定超时参数,可能因连接超时导致断连,修改laravel-echo-server.js的Redis配置:

"databaseConfig": {
    "redis": {
        "host": "127.0.0.1",
        "port": 6379,
        "password": null,
        "connectTimeout": 5000,
        "retryDelayOnFailover": 100,
        "enableReadyCheck": true,
        "maxRetriesPerRequest": 3
    },
    "sqlite": {
        "databasePath": "/database/laravel-echo-server.sqlite"
    }
}

同时修改Laravel项目config/database.php中的Redis配置,增加超时和持久化参数:

'redis' => [
    'client' => env('REDIS_CLIENT', 'phpredis'),
    'default' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', '6379'),
        'database' => env('REDIS_DB', '0'),
        'read_write_timeout' => 60,
        'persistent' => true,
    ],
],

3. 启用日志排查断连原因

开启laravel-echo-server的日志功能,便于定位问题:
修改laravel-echo-server.js:

"devMode": true,
"logLevel": "info"

如果用PM2管理进程,可配置日志输出:

pm2 start laravel-echo-server -- start --log="laravel-echo-server.log"

4. 切换队列连接类型

当前使用sync队列驱动,广播任务同步执行可能引发阻塞,建议改为Redis队列:
修改.env:

QUEUE_CONNECTION=redis

启动队列worker:

php artisan queue:work redis --daemon

5. 检查本地网络与端口设置

确保本地6001端口未被防火墙拦截,排查网络波动问题,避免因网络不稳定导致WebSocket连接中断。

内容的提问来源于stack exchange,提问作者Rahul Kumar Rajput

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:51:09