下面由教學欄目給大家介紹laravel-echo-server廣播服務搭建,希望對需要的朋友有所幫助!
當前專案中很多場景採用 Redis 佇列和定時任務來處理執行時間較長的任務,這些任務執行的狀態和執行結果只能通過前端重新傳送請求獲取。
為了優化程式體驗,讓使用者儘可能早的關注到任務執行結果,我們評估了各種方案。為了降低前後端的溝通成本避免重複造輪子,我們決定採用 Laravel 框架內建的廣播功能。
官方推薦採用 pusher 來搭建應用,pusher 的好處是搭建起來非常簡單。但考慮到是國外的服務,存在存取穩定性風險;且目前專案規模較小,於是嘗試自己搭建 Websocket 服務,使用的就是 Laravel 框架官方提到的 tlaverdure/laravel-echo-server 專案。
這個專案的使用方法可以直接去他們的 github 頁面 獲得,我們看中的幾點如下:
我們一開始使用了 oanhnn/laravel-echo-server 這個映象來啟動容器,在偵錯過程中發現這個服務並不穩定,Node 的服務會在異常時直接退出,這是我們碰到的第一個坑。為了快速解決這個問題,我們再這個映象基礎上加入了 supervisor 來負責進行服務程序的退出後重新啟動的任務,並做成了我們自己的映象。
在試用 Redis 訂閱時,除了常規的資料庫地址和密碼等引數以外,key 字首是我們碰到的又一個坑,對應在 laravel-echo-server 服務中的 laravel-echo-server.json 檔案中的 keyPrefix 設定項,一開始沒有找到正確的方法,無論怎麼設定都不對。後來發現如果想知道要廣播事件的程式當前的 Redis key 字首是什麼,就在 tinker 中執行以下指令碼即可。
# php artisan tinkerconfig('database.redis.options.prefix');
由於生產環境採用了 HTTPS 協定,所以需要給服務增加證書,但因為我是 Node 小白,沒有 Node 程式使用證書的設定經驗,所以一輪嘗試之後基本上放棄了,之後採用了 Nginx 代理的方式使用證書,經過幾輪嘗試,終於設定成功。
server { listen port; server_name your-domain; ssl on; ssl_certificate path-to-pem; ssl_certificate_key path-to-key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location /socket.io { proxy_pass http://container-name:6002; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; }}
Laravel 廣播將頻道分為:公共、私有和出席(我可能翻譯的不對,請指正),其中後兩者是需要授權存取。我們需要用到的是私有頻道,只有經過授權的人才能從前端訂閱我們的事件。這也是我們遇到的一個坑。
經我們觀察和原始碼閱讀,發現 laravel-echo 的整體授權過程是:
authEndpoint
和 authHost
這兩項,嚮應用伺服器傳送一個 HTTP POST,POST 資料是 channel 名字,同時透傳 header 中的 Authorization 資料;我們在實踐中遇到兩個問題。第一個問題是,我們專案的授權守門邏輯並非 laravel 預設的,所以預設的 Broadcast::routes()
所引入的路由無法直接使用。發現問題後,我們重新加入了我們自己的授權路由,並設定到 laravel-echo-server.json 的 authEndpoint
設定項中。
另一個問題是,我們沒有采用標準的 RESTFul 協定規則:響應對應的 HTTP Code 來描述錯誤狀態。致使 laravel-echo-server 即便在授權失敗的時候也不能發現問題並反饋給前端程式,情況類似下圖:
遲早還是要還債的…
這個功能開發的,沒有當初想的那麼順利,主要的問題有以下幾點:
以上就是分享laravel-echo-server廣播服務搭建的詳細內容,更多請關注TW511.COM其它相關文章!