九保すこひです(フリーランスのITコンサルタント、エンジニア)
さてさて、Laravelは今や世界中の開発者に利用される人気フレームワークになったわけですが、その結果として映画のスピンオフのようにLaravelを利用した様々なパッケージが公開されいます。
そして、つい数日前にLaravel WebSockets
というパッケージが公開されました。
Laravel WebSockets
は、Laravelに独自のウェブソケットを実装することができるパッケージで、つまりはチャットのようにリアルタイムに情報をやりとりできるようになります。
そして、私は結構新しいもの好きな一面もありますし、この間 Laravel+Vueでリアルタイム・チャットをつくる(ダウンロード可) という記事も公開しているので、この新しいパッケージを実際に試してみることにしました。
ということで、今回はLaravel Websockets
の使い方を紹介します。
ぜひ参考にしてみてくださいね。
※ 実行環境: Laravel 5.7
目次
パッケージをインストールする
Pusherをインストール
ちょっと奇妙に聞こえるかもしれませんが、まずはPusher
を使えるようにしておきましょう。
理由は、ウェブサイトにも書かれていますが一番シンプルにLaravel Websockets
を使う方法は、Pusherを置き換える(のっとる)形だからです。
そのため、Laravel+Vueでリアルタイム・チャットをつくる(ダウンロード可)の記事を参考にして、pusher/pusher-php-server
やlaravel-echo
、pusher-js
などのインストールを完了させ、さらにビルドもしておいてください。(つまり、この記事のPusher以外の部分を実行しておいてください)
Laravel Websocketsをインストール
そして、Laravel Websockets
の本体をインストールします。
composer require beyondcode/laravel-websockets
インストールが完了したら、次のコマンドでマイグレーションを実行してください。
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="migrations"
php artisan migrate
マイグレーションが完了するとwebsockets_statistics_entries
というテーブルが作成されることになり、ここにアクセス情報が保存されていきます。
つぎに、設定ファイルもコピーして使えるようにしておきましょう。
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="config"
これで、config/websockets.php
が作成されましたので、このファイル内に設定を書き込むことになります。
コンフィグを設定する
先ほども書きましたが、Laravel Websockets
はPusherの設定を利用して接続をしますので、設定するのは、config/broadcasting.php
内のpusher
の部分です。
初期状態では、書かれていないhost
、port
、scheme
を追加してください。
'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'), 'encrypted' => true, 'host' => 'l57.test', // ご自身のホスト名 'port' => 6001, 'scheme' => 'http' // or https ], ],
そして、resources/js/bootstrap.js
内のLaravel Echoにも同じくwsHost
、wsPort
を追加します。
window.Echo = new Echo({ broadcaster: 'pusher', key: process.env.MIX_PUSHER_APP_KEY, cluster: process.env.MIX_PUSHER_APP_CLUSTER, // encrypted: true, wsHost: window.location.hostname, wsPort: 6001, // disableStats: true, });
なお、もしウェブソケットの接続データが必要ない場合はdisableStats
をtrue
に設定してください。(初期状態では有効になっています。)
また、ウェブサイトがHTTPS接続できる場合はencrypted
もtrue
にする方がいいでしょう。
では、ビルドしてapp.js
を更新します。
npm run dev
※ 注意する点
なお、私の環境では始め実際にPusherで設定したアクセス情報を使っていましたが、この場合、従来通りPusherへアクセスされてしまう場合があるようでした。そのため、.env
は次のようにするといいでしょう。
PUSHER_APP_ID=1 PUSHER_APP_KEY=laravelWebsockets PUSHER_APP_SECRET=laravelWebsockets PUSHER_APP_CLUSTER=ap1
ウェブソケットサーバーを起動する
では実際にこの設定で、「Laravel+Vueでリアルタイム・チャットをつくる」で作成したチャットを実行してみます。
まずは次のコマンドでウェブソケット・サーバーを開始します。
php artisan websockets:serve
するとコマンド上に、Starting the WebSocket server on port 6001...
という表示がされて、アクセスを待機していることがわかります。
※ ちなみに終了する際はCrtl + c
です。
ではチャットページにアクセスして開発者ツールで読み込み内容を確認してみます。
現在はpusher.com
ではなく指定したホストへアクセスされるようになっています。
では実際にメッセージを入力して・・・・・・
送信します。
思い通りうまくいきました!
これで完了です。
お疲れ様でした。
おまけ
Laravel Websockets
にはデバッグ用のダッシュボードも用意されています。
http(s)://******/laravel-websockets
へアクセスすると次のような表示になりますので、「Connect」ボタンをクリックしてください。
すると、次のように様々な情報にアクセスできるようになります。
おわりに
ということで、今回はLaravelパッケージの中からLarave-Websockets
を使ってリアルタイムチャットを実装してみました。
サイトの規模が小さい場合は、Pusherの無料プランで十分対応できると思うので、そちらをおすすめしますが、徐々にサイト規模が大きくなってきた場合に自前でウェブソケットを実装する場合は今回のLaravel-Websockets
も選択肢に入ってくるのではないでしょうか。
もちろん、node.jsの方がパフォーマンスは早そうですが、Laravelだけで完結できるのは大きなアドバンテージになるでしょう。
みなさんの参考になれば嬉しいです。
ではでは〜!