Laravel中broadcast.php的Pusher配置无效,事件仍发往pusher.com
Laravel WebSocket 广播异常问题
我正在开发实时聊天应用,采用Laravel+WebSocket技术,使用beyondcode/laravel-websocket库。已将广播驱动设置为pusher,但触发event(new App\Events\UserStatusEvent())事件时,消息未发送至配置的localhost(127.0.0.1),而是发往pusher.com。已清除缓存和配置,问题仍未解决。
相关配置代码
1. broadcast.php 配置
'connections' => [ 'pusher' => [ 'driver' => 'pusher', 'key' => env('PUSHER_APP_KEY'), 'secret' => env('PUSHER_APP_SECRET'), 'app_id' => env('PUSHER_APP_ID'), 'options' => [ 'cluster' => env('PUSHER_APP_CLUSTER'), 'host' => '127.0.0.1', 'port' => env('PUSHER_PORT', 6001), 'scheme' => env('PUSHER_SCHEME', 'http'), 'encrypted' => true, ], 'client_options' => [ // Guzzle client options ], ], ]
2. UserStatusEvent 事件类
class UserStatusEvent implements ShouldBroadcast { use Dispatchable, InteractsWithSockets, SerializesModels; public function __construct() { // } public function broadcastOn() { return new PresenceChannel('status-update'); } }
3. .env 配置
BROADCAST_DRIVER=pusher CACHE_DRIVER=array FILESYSTEM_DRIVER=local QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 PUSHER_APP_ID=skldfjiklkd PUSHER_APP_KEY=sdlkfewif PUSHER_APP_SECRET=slkdfifwef PUSHER_APP_CLUSTER=mt1
4. bootstrap.js 前端配置
import axios from 'axios'; window.axios = axios; window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 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'], });
问题排查与解决步骤
1. 补充.env中的WebSocket环境变量
当前.env缺少本地WebSocket的关键配置,Laravel会默认走Pusher官方服务。添加以下内容到.env:
PUSHER_HOST=127.0.0.1 PUSHER_PORT=6001 PUSHER_SCHEME=http # 同步前端VITE变量 VITE_PUSHER_HOST=127.0.0.1 VITE_PUSHER_PORT=6001 VITE_PUSHER_SCHEME=http
2. 修正broadcast.php的加密配置
使用http协议时,encrypted需设为false,同时改为读取env变量提升灵活性:
'options' => [ 'cluster' => env('PUSHER_APP_CLUSTER'), 'host' => env('PUSHER_HOST', '127.0.0.1'), 'port' => env('PUSHER_PORT', 6001), 'scheme' => env('PUSHER_SCHEME', 'http'), 'encrypted' => env('PUSHER_SCHEME', 'http') === 'https', ],
3. 重置缓存并重启WebSocket服务
执行以下命令确保配置生效:
php artisan config:clear php artisan cache:clear php artisan websockets:serve
4. 优化前端Echo配置
调整wsHost逻辑,优先使用本地配置而非cluster地址:
wsHost: import.meta.env.VITE_PUSHER_HOST || '127.0.0.1', wsPort: import.meta.env.VITE_PUSHER_PORT || 6001, wssPort: import.meta.env.VITE_PUSHER_PORT || 6001, forceTLS: import.meta.env.VITE_PUSHER_SCHEME === 'https',
内容的提问来源于stack exchange,提问作者etranz
相关产品推荐
相关产品推荐

