教你用laravel-websockets搞個「低配」廣播系統
這篇文章為大家帶來了關於Laravel的相關知識,其中主要介紹了怎麼用laravel-websockets來實現一個「低配版」廣播系統,有興趣的朋友一起來看一下吧,希望對大家有幫助。
前言
網路上找了好幾個教學都沒成功,然後死磕一個教學不斷研究最後成功了。然後就寫了這篇教程,希望能幫到跟我一樣笨的人。另外希望不要誤導讀者。希望讀者最好不要過度信任我的這個教學。我其實是稀裡糊塗地成功的,我的這個教學可能也有個坑。 還有一點是我覺得我研究的過程好像收穫蠻大的,如果時間充裕的話建議自己研究。
教學的開頭我先大致介紹一下我是怎麼搞出這個教學介紹的方法的。我建議看教學的人重視這部分,因為我懷疑 Laravel 或相關的函式庫一更新可能又會出現不相容或錯亂的情況,然後就又有問題了。到時候可能就需要讀者自行研究了。
為什麼說是大致介紹呢,因為很多地方我覺得都是我瞎貓碰死耗子蒙出來的。另外可能需要一些無法言說的經驗吧。
盡量縮小實驗的對象的規模,找步驟少的教程
剛開始我是照著官方文檔中文版做的,後來發現這個實在是太複雜了,可能錯一步就會失敗。而且有的時候連錯誤提示也沒有,就算有錯誤提示不是搜不到就是有太多回答完全不一樣的問題。如果盡量縮小規模的話,應該就能盡量少踩點坑了。
將任務分解得可以獲得子任務成功的回饋
剛開始我是一步一步跟著做,然後最後看是否成功,後來發現這種方法太低效了。然後我發現某些子步驟是可以用一些方法判斷是否成功的,例如 laravel-websockets 安裝成功之後能開啟那個 dashboard。就是 /laravel-websockets 。另外還有發送廣播的程式碼如果成功了的話可以在前面說的那個 dashboard 裡看到效果。最後就是全部成功就能在瀏覽器裡看到效果了。所以後來我如果目前階段沒有成功就不會繼續做下去了,繼續研究這個階段哪裡錯了。
多打 Log
我是透過打 Log 發現客戶端的 Echo 根本沒有初始化成功的,因為少個參數。之前好像也有個錯誤提示,但我好像沒看懂。透過在初始化 Echo 的前後分別輸出兩個不一樣的 Log,我發現只有前一條執行了,後一條根本沒執行,所以得出了程式遇到錯誤就停止執行了的結論。
對被實驗的對象盡量熟悉起來
例如我沒搜尋到某條報錯的相關資訊。但是後來發現裡面的某個字在配置裡出現過,改了一下那個配置就好了。就是這個:「Uncaught Options object must provide a cluster」。不過後來我在網路上發現個跟我一樣的方法,沒準我之前看過那個方法,可能是因為樓主說沒用所以我就沒試過。
多綜合各方信息,特別是那些成功的
雖然不一定能拿來就用,甚至可能會產生誤導,但是我相信信息多一些還是更有助於解決問題的。例如我就在嗶哩嗶哩上搜過「laravel 廣播」看過幾段影片。也搜尋了一些非官方文件的教學。
如果搜錯誤提示沒有用的東西或搜尋結果太多就看看代碼
不過我感覺這條有用的機率不大,實在沒招了再用吧。我是透過這個方法發現我在取消註解程式碼的時候少取消註解了一行,然後出現了很奇怪的錯誤提示。
就算成功了也不要高興得太早,多練習幾遍
步驟越多越容易出問題,這個廣播系統的步驟是真多。多練習也能多熟悉一點。
盡量選擇更新的教學
我通常會在搜尋引擎裡加個一年內的條件。
針對搜尋引擎程式設計
感覺這次大概有一半以上的問題都是透過搜尋引擎解決的吧,完全自己解決的部分好像很少。
本體
我這個教學某些方面比較囉嗦,是從建立專案開始的,另外也提到了設定資料庫。水平比較高的讀者可以忽略一些內容。至於高端的讀者應該用不著看我的這種東西。不過我對命令的介紹基本上沒有,有需求建議去看下面的英文文章。
備忘
我這個是公共頻道的。還有隊列用的是預設的 sync,據說只能用來開發環境。總之我這個教學應該是挺殘廢的,但是跑通了應該就可以以此為起點根據官方文檔實驗新的配置和添加新的功能了。
我的這個教學主要參考自這篇文章:How to use Laravel WebSockets。
建立專案
在Apache24\htdocs 或類似的地方執行下面的命令:
composer create-project laravel/laravel bc
在專案路徑中執行以下命令:
php artisan serve
注意運行完上面的命令目前命令列視窗一般就不能運行命令了,需要重啟一個命令列視窗。想要在繼續在目前命令列視窗執行命令除非配合後台運行的命令。
配置資料庫資訊
在配置資料庫之前需要建立一個資料庫,我用的是 test。不過就算不創建在 migrate 的時候也會提示創建。這個差點就忘了,因為之前一直沒有刪除這個資料庫。
.env
DB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_PORT=3306DB_DATABASE=testDB_USERNAME=rootDB_PASSWORD=1234
注意要填你的資料庫的實際的信息,別照抄我的配置。
安裝伺服器端套件beyondcode/laravel-websockets
在專案路徑中執行以下指令:
composer require beyondcode/laravel-websockets php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="migrations"php artisan migrate php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="config"
安裝pusher
在專案路徑中執行以下指令:
composer require pusher/pusher-php-server
注意這篇我跟我參考的那篇文章不一樣,我這個安裝的應該是最新版的。原文好像指定版本了。
配置 Laravel WebSockets
.env
BROADCAST_DRIVER=pusherPUSHER_APP_ID=12345PUSHER_APP_KEY=ABCDEFGPUSHER_APP_SECRET=HIJKLMNOPPUSHER_HOST=127.0.0.1PUSHER_PORT=6001PUSHER_SCHEME=httpPUSHER_APP_CLUSTER=mt1
#注意這裡跟我參考的那篇英文文章也不一樣,我強迫症,感覺改 .env 更優雅一些。畢竟其他地方都會優先讀 .env。感覺 .env 比較像是函數,一個地方改動了不用修改所有呼叫的地方。感覺前一句有點問題,大概就是那個意思吧。
再注意一下第二條到第四條的值是隨便填的。
運行Laravel WebSockets 伺服器
在專案路徑中執行以下命令:
php artisan websockets:serve
這個也是運行之後當前命令列視窗就不能輸入命令了。 【推薦學習:laravel影片教學】
之後在瀏覽器網址列輸入127.0.0.1:8000/laravel-websockets 就能看前面的操作是否成功了。如果你不是透過「php artisan serve」運行的伺服器的話可能連接埠會不一樣。點擊那個 Connect 按鈕如果在 Events 下面出現一些東西應該就是階段性成功了。注意這個網頁在沒那個啥的情況下打開是非常慢的,至少在我這裡很慢。因為裡面有個 js 函式庫的下載速度很慢。 注意下面的改 blade 模板的行為是可選的!另外我不知道下面的 cdn 有沒有問題,畢竟好像不是大廠的 cdn。 如果你嫌慢又不想那個啥的話可以將vendor\beyondcode\laravel-websockets\resources\views\dashboard.blade.php 中的
<script src="https://www.php.cn/link/19e0c9edc141240b5de750fa83ba1bed"></script>
換成
<script src="https://cdn.bootcdn.net/ajax/libs/plotly.js/2.17.0/plotly.min.js"></script>
我是透過用VS Code 搜尋功能直接搜尋cdn.plot.ly/plotly-latest.min.js 搜出來這個檔案的。另外是在火狐的開發者工具的網路中發現這個 js 函式庫載入速度慢的。另外這種直接改這種地方的文件應該是不太優雅。
建立事件
在專案路徑中執行以下命令:
php artisan make:event NewTrade
app\Events\NewTrade.php
<?php namespace App\Events;use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PresenceChannel; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Contracts\Broadcasting\ShouldBroadcast;use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; class NewTrade implements ShouldBroadcast{ use Dispatchable, InteractsWithSockets, SerializesModels; public $trade; /** * Create a new event instance. * * @return void */ public function __construct($trade) { $this->trade = $trade; } /** * Get the channels the event should broadcast on. * * @return \Illuminate\Broadcasting\Channel|array */ public function broadcastOn() { return new Channel('trades'); }}
在專案路徑中執行以下命令:
php artisan tinker
執行這條指令後會啟動Laravel 的互動式解釋器,我理解就是輸入一些語句可以直接執行。另外還有一些其他的實用的指令。這個也是運行之後當前命令列視窗就不能輸入正常的系統命令了,但是這個命令列視窗之後要輸入 php 語句。順便說一下,VS Code 裡的終端機在 tinker 裡沒辦法 Ctrl V,但右鍵是貼上的功能。
然後在上面的執行過php artisan tinker 的那個命令列視窗執行以下指令:
event (new \App\Events\NewTrade('test'))
之後就能在上面提到的那個127.0.0.1:8000/laravel -websockets 頁面看到發出的訊息了。能看到的話就表示階段性成功了。
安裝客戶端套件laravel-echo
在專案路徑中執行以下命令:
npm installnpm install --save-dev laravel-echo pusher-js
resources\js\bootstrap.js
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, 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'], cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER,});
注意這裡也跟我參考的那篇英文文章不一樣。我只是取消註釋了那個文件中的那些東西,並在結尾添加了一行“cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER,”。
在專案路徑中執行以下命令:
npm run dev
這個也是運行之後目前命令列視窗就不能輸入命令了。
添加客户端脚本
在文件
resources\views\welcome.blade.php
的 head 标签的结尾添加以下代码:
@vite('resources/js/app.js') <script> window.onload = function(){ Echo.channel('trades') .listen('NewTrade', (e) => { console.log(e.trade); }); }; </script> </head>
注意这里也跟我参考的那篇英文文章不一样。改了两处,一个是导入 app.js 的方法换了。另外套了一层 window.onload。
然后在浏览器的地址栏输入 127.0.0.1:8000/ 启动开发者工具并切换到控制台标签页。然后再在前面运行过 php artisan tinker 的那个命令行窗口中执行以下命令:
event (new \App\Events\NewTrade('test'))
最后切换到前面提到的开发者工具中的控制台标签页,应该能看到一条“test”消息。能看到就说明最终成功了。
结语
我只是个菜狗,不要问我太复杂的问题。我从开始搞这个广播系统到最终成功好像用了两三天的时间,就凭这个时间你应该就能体会到我有多菜了。
最后因为我是菜狗,所以可能会有一些理解上的错误,欢迎指出来。不过按照我的这个教程做基本上应该是会成功的。我做完这个教程自己照着又做了两遍,没问题。不过也可能会因为我没注意到一些东西,或者读者的环境跟我的不一样导致读者不成功。所以我也不敢保证。感觉早晚会失效,失效了如果我没更新的话谁看到了就回复一下提醒一下别人吧。
原文地址:https://learnku.com/articles/74366
以上是教你用laravel-websockets搞個「低配」廣播系統的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

在使用CraftCMS開發網站時,常常會遇到資源文件緩存的問題,特別是當你頻繁更新CSS和JavaScript文件時,舊版本的文件可能仍然被瀏覽器緩存,導致用戶無法及時看到最新的更改。這個問題不僅影響用戶體驗,還會增加開發和調試的難度。最近,我在項目中遇到了類似的困擾,經過一番探索,我找到了wiejeben/craft-laravel-mix這個插件,它完美地解決了我的緩存問題。

想要學習 Laravel 框架,但苦於沒有資源或經濟壓力?本文為你提供了免費學習 Laravel 的途徑,教你如何利用網絡平台、文檔和社區論壇等資源,從入門到掌握,為你的 PHP 開發之旅奠定堅實基礎。

Laravel 提供了一個全面的 Auth 框架,用於實現用戶登錄功能,包括:定義用戶模型(Eloquent 模型)創建登錄表單(Blade 模板引擎)編寫登錄控制器(繼承 Auth\LoginController)驗證登錄請求(Auth::attempt)登錄成功後重定向(redirect)考慮安全因素:哈希密碼、防 CSRF 保護、速率限制和安全標頭。此外,Auth 框架還提供重置密碼、註冊和驗證電子郵件等功能。詳情請參閱 Laravel 文檔:https://laravel.com/doc

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

在面向初学者的 Laravel 框架版本选择指南中,本文深入探討了 Laravel 的版本差異,旨在協助初學者在眾多版本之間做出明智的選擇。我們將重點介紹每個版本的關鍵特徵、比較它們的優缺點,並提供有用的建議,幫助新手根據他們的技能水準和項目需求挑選最合適的 Laravel 版本。對於初學者來說,選擇一個合適的 Laravel 版本至關重要,因為它可以顯著影響他們的學習曲線和整體開發體驗。

Laravel框架內置了多種方法來方便地查看其版本號,滿足開發者的不同需求。本文將探討這些方法,包括使用Composer命令行工具、訪問.env文件或通過PHP代碼獲取版本信息。這些方法對於維護和管理Laravel應用程序的版本控制至關重要。

Laravel 和 ThinkPHP 都是流行的 PHP 框架,在開發中各有優缺點。本文將深入比較這兩者,重點介紹它們的架構、特性和性能差異,以幫助開發者根據其特定項目需求做出明智的選擇。
