搭建基於 Soketi 的 WebSockets 高效能服務(Laravel 零侵入免費使用)

24K大白羊發表於2022-02-11

因專案需求核心功能對 WebSocket 高度依賴,所以調研了Larave支援比較好的驅動,Laravel 官方推薦了 Pusher、Ably 以及開源的 laravel-websockets 和 Soketi,前2個整合起來非常簡單,但是考慮網路延遲的原因放棄了。

最終選擇了 Soketi 提供 WebSocket 服務,主要原因還是考慮到效能(還沒有做壓力測試),而且還完全相容 Pusher v7 協議,官網介紹:

Soketi is your simple, fast, and resilient open-source WebSockets server

在阿里雲上配置了一個對外的服務,在開發過程中如果想做測試可以直接使用,我之前都是用 Pusher 做的測試,有時候網路延時的確很高,一點不穩定。

首先就是要安裝 composer require pusher/pusher-php-server 來支援推送。

具體的配置資訊和 pusher 稍有不同,主要就是自定義了 host 和 port 到自定義的伺服器,其他都是一樣的。

env 檔案

BROADCAST_DRIVER=pusher
PUSHER_APP_ID=532232132
PUSHER_APP_KEY=DZIqMLJdGi633kB3BYHN
PUSHER_APP_SECRET=pelvQlQFJecoYWvVUbF8
PUSHER_APP_CLUSTER=ap3
PUSHER_HOST=pusher.qiyuankeji.cn
PUSHER_PORT=6002
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
MIX_PUSHER_HOST="${PUSHER_HOST}"
MIX_PUSHER_PORT="${PUSHER_PORT}"

config/broadcasting.php

'pusher' => [
    'driver' => 'pusher',
    'key' => env('PUSHER_APP_KEY', 'app-key'),
    'secret' => env('PUSHER_APP_SECRET', 'app-secret'),
     'app_id' => env('PUSHER_APP_ID', 'app-id'),
    'options' => [
        'host' => env('PUSHER_HOST', '127.0.0.1'),
         'port' => env('PUSHER_PORT', 6001),
         'scheme' => env('PUSHER_SCHEME', 'https'),
        'encrypted' => true,
         'useTLS' => env('PUSHER_SCHEME') === 'https',
        ],
    ],

resources/js/bootstrap.js

import Echo from 'laravel-echo';

window.Pusher = require('pusher-js');

window.Echo = new Echo({
  broadcaster: 'pusher',
  key: process.env.MIX_PUSHER_APP_KEY,
  wsHost: process.env.MIX_PUSHER_HOST,
  wsPort: process.env.MIX_PUSHER_PORT,
  wssPort: process.env.MIX_PUSHER_PORT,
  forceTLS: false,
  encrypted: true,
  disableStats: true,
  enabledTransports: ['ws', 'wss'],
});

配置好這些就可以直接使用 Echo 來監聽廣播了,爭取一直穩定的執行下去,後續做個免費申請獨立祕鑰的介面,就可以玩起來了。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章