LoginSignup
0
0

ソケット通信サーバーアプリのフレームワークをLaravelと連携してみました

Last updated at Posted at 2024-06-01

はじめに

ここでは以下の記事でご紹介しているようなsoket-managerフレームワーク上のプロジェクトをLaravelへ連携する方法をご紹介します。

以降では新規プロジェクトを連携する場合と既成プロジェクトを連携する場合に分けて話を進めます。
それぞれの作業の内訳は以下の通りです。

【新規プロジェクトを連携する場合】

ステップ1)ライブラリをインストール
ステップ2)workerコマンドをコピー

【既成プロジェクトを連携する場合】

さらに以下2ステップが必要です。

ステップ3)既成クラスをコピー
ステップ4)既成のメインクラスをLaravelのCommandクラスへ変換
ステップ5)設定系ファイルのコピー【任意】

環境

言語
PHP v8.2.4(v8.1.0以降)
Laravel
v10.48.10

新規プロジェクトを連携

ステップ1)ライブラリをインストール

Laravelのプロジェクトルートで以下のコマンドを実行すればインストールできます。

socket-managerライブラリをインストールするコマンド
> composer require socket-manager/library

ステップ2)workerコマンドをコピー

workerコマンドをLaravelのプロジェクトルートへコピーします。
コマンドでコピーする場合はLaravelのプロジェクトルートへ移動してから以下のコマンドを実行してください。

workerコマンドをコピーするコマンド
> cp ./vendor/socket-manager/library/bin/worker .

コピーが完了するとworkerコマンドはLaravelのartisanコマンドと自動で連携します。
Usageを確認すると以下のように表示されます。

> php worker

SOCKET-MANAGER Framework 1.0.0
Usage:
  command [arguments]

 craft
  craft:init <初期化クラス名>                     初期化クラスの生成
  craft:parameter <UNITパラメータクラス名>        UNITパラメータクラスの生成
  craft:protocol <プロトコルUNIT定義のクラス名>   プロトコルUNIT定義のクラスとステータス名Enumの生成
  craft:command <コマンドUNIT定義のクラス名>      コマンドUNIT定義のクラスとキュー/ステータス名Enumの生成
  craft:main <メイン処理のクラス名>               メイン処理クラスの生成
 laravel
  laravel:command <メイン処理のクラス名>          Laravelコマンドクラスの生成

--------------------------------------------------------------------------------
Laravel Framework 10.48.10

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display help for the given command. When no command is given display help for the list command
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi|--no-ansi  Force (or disable --no-ansi) ANSI output
  -n, --no-interaction  Do not ask any interactive question
      --env[=ENV]       The environment the command should run under
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  about         

...長いので以下省略

craft:settingcraft:localeコマンドに関してはLaravel環境では表示されません。

Usageのハイフン線の上側でworkerコマンドのUsageが、下側でartisanコマンドのUsageが表示されていれば連携は完了です。

あとはworkerコマンドで随時必要なクラスを生成していく事になります。
但し、メインクラスの作成に関してはLaravelのバッチ処理として登録する必要があるので以下のコマンド実行が必要です。

コマンドクラス名をMainForTestにする場合
> php worker laravel:command MainForTest

[success] メイン処理クラスの生成に成功しました (MainForTest)
[success] Laravelコマンドクラスの生成に成功しました (MainForTest)

このコマンドを実行するとapp/MainClass/MainForTest.phpapp/Console/Commands/MainForTest.phpが作成されます。
その後Usageを表示するとLaravelのUsage側で以下のように表示されます。

Usage表示
> php worker

SOCKET-MANAGER Framework 1.0.0
.
.
.
--------------------------------------------------------------------------------
Laravel Framework 10.48.10
.
.
.
 app
  app:main-for-test       Command description
.
.
.

サーバー起動はいつも通りの以下コマンドで実行できます。

サーバー起動(10000ポートで起動する場合)
> php worker app:main-for-test 10000

既成プロジェクトを連携

ステップ3)既成クラスをコピー

app配下の既成クラスはLaravelのapp配下にディレクトリごとコピーしてください。
logsディレクトリはLaravelのプロジェクトルートにコピーする必要があります。

ステップ4)既成のメインクラスをLaravelのCommandクラスへ変換

既成のメインクラスはそのままでは使えないので以下のコマンドを実行してLaravelのコマンドクラスへ変換できます。

デモ版のWebsocketサーバーを変換する場合
> php worker laravel:command ChatServerForWebsocket

[success] Laravelコマンドクラスの生成に成功しました (ChatServerForWebsocket)

この時app/MainClass内のファイルはそのまま残ります。
その後Usageを表示するとLaravelのUsage側で以下のように表示されます。

Usage表示
> php worker

SOCKET-MANAGER Framework 1.0.0
.
.
.
--------------------------------------------------------------------------------
Laravel Framework 10.48.10
.
.
.
 app
  app:chat-server         チャットサーバー
.
.
.

サーバー起動はいつも通りの以下コマンドで実行できます。

サーバー起動(10000ポートで起動する場合)
> php worker app:chat-server 10000

ステップ5)設定系ファイルのコピー【任意】

定数やメッセージなどの設定系のファイルを利用されている場合は適宜Laravel環境へコピーしてください。
設定値を取得するヘルパー関数の仕様はLaravelに合わせてあるのでソースを変更する必要はありません。

対応するディレクトリの名前は次の通りです。

・setting(socket-manager用) ⇒ config(laravel用)
・locale(socket-manager用) ⇒ lang(laravel用)

※ディレクトリごとファイルを上書きしてしまう事故を防ぐためにディレクトリ名は敢えて異なるものを採用しています。
※重複しているファイル名がある場合は設定内容をご自身の目で確認しながらマージを行ってください。
setting/app.phpファイルにはタイムゾーンやロケールなどシステムに関わる内容が含まれています。基本的にはLaravelのconfig/app.phpの内容と同じはずですが念のため内容を確認される事をお勧めします。

Laravelのリソースを使う

Laravelとの連携が完了した事で今後はLaravelのリソースが使えるようになります。
せっかくなのでログ出力をLaravelのLoggerを使って出力してみます。
以降ではデモ版のWebsocketサーバーを使います。

デモ版の内容は以下の記事でご紹介しています。

まずは初期化クラス内でuse Illuminate\Support\Facades\Log;を追加した上でlogWriterハンドラーを以下のように修正します。
以下のコメントで囲んでいる部分が元のソースです。

app/InitClass/InitForWebsocket.php
public function getLogWriter()
{
    return function(string $p_level, array $p_param)
    {
        Log::channel('socket-manager-log')->{$p_level}('TEST', ['param' => $p_param]);

        /*
        $filename = date('Ymd');
        $now = date('Y-m-d H:i:s');
        $log = $now." {$p_level} ".print_r($p_param, true)."\n";
        error_log($log, 3, "./logs/socket-manager-log/{$filename}_W{$this->port}.log");
        */
    };
}

Laravelのconfig/logging.php内で以下の定義を追加してサーバー起動します。

config/logging.php
'socket-manager-log' => [
    'driver' => 'daily',
    'path' => storage_path('logs/bat/socket-manager-log/laravel.log'),
    'level' => 'debug',
    'days' => 0,
],
デモ版Websocketサーバー起動(10000ポートで起動する場合)
> php worker app:chat-server 10000

クライアントと接続すると以下の場所にログファイルが作成されます。

ログファイルの出力先
/storage
    /logs
        /bat
            /socket-manager-log
                laravel-<日付フォーマット("Y-m-d")>.log

おわりに

これでWebアプリとソケット通信サーバーのオールインワン開発環境ができました。
上記ではLaravelのログ出力を試しましたが、他にも色々使えるはずですので試してみてください。

生のPHP環境でデータベースを使う場合は標準のPDOライブラリ等を使う事が多いと思いますが、フレームワークの作業に慣れている方はEloquentやクエリビルダ等を使ってデータベースと連携した方が使いやすいでしょう。

ここで使用したLaravelは最近のバージョンですが、PHPのバージョンがv8.1.0以降で動作している環境であれば問題ないと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0