はじめに
ここでは以下の記事でご紹介しているような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のプロジェクトルートで以下のコマンドを実行すればインストールできます。
> composer require socket-manager/library
ステップ2)workerコマンドをコピー
worker
コマンドをLaravelのプロジェクトルートへコピーします。
コマンドでコピーする場合はLaravelのプロジェクトルートへ移動してから以下のコマンドを実行してください。
> 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:setting
、craft:locale
コマンドに関してはLaravel環境では表示されません。
Usageのハイフン線の上側でworker
コマンドのUsageが、下側でartisan
コマンドのUsageが表示されていれば連携は完了です。
あとはworker
コマンドで随時必要なクラスを生成していく事になります。
但し、メインクラスの作成に関してはLaravelのバッチ処理として登録する必要があるので以下のコマンド実行が必要です。
> php worker laravel:command MainForTest
[success] メイン処理クラスの生成に成功しました (MainForTest)
[success] Laravelコマンドクラスの生成に成功しました (MainForTest)
このコマンドを実行するとapp/MainClass/MainForTest.php
とapp/Console/Commands/MainForTest.php
が作成されます。
その後Usageを表示するとLaravelのUsage側で以下のように表示されます。
> php worker
SOCKET-MANAGER Framework 1.0.0
.
.
.
--------------------------------------------------------------------------------
Laravel Framework 10.48.10
.
.
.
app
app:main-for-test Command description
.
.
.
サーバー起動はいつも通りの以下コマンドで実行できます。
> php worker app:main-for-test 10000
既成プロジェクトを連携
ステップ3)既成クラスをコピー
app
配下の既成クラスはLaravelのapp
配下にディレクトリごとコピーしてください。
logs
ディレクトリはLaravelのプロジェクトルートにコピーする必要があります。
ステップ4)既成のメインクラスをLaravelのCommandクラスへ変換
既成のメインクラスはそのままでは使えないので以下のコマンドを実行してLaravelのコマンドクラスへ変換できます。
> php worker laravel:command ChatServerForWebsocket
[success] Laravelコマンドクラスの生成に成功しました (ChatServerForWebsocket)
この時app/MainClass
内のファイルはそのまま残ります。
その後Usageを表示するとLaravelのUsage側で以下のように表示されます。
> php worker
SOCKET-MANAGER Framework 1.0.0
.
.
.
--------------------------------------------------------------------------------
Laravel Framework 10.48.10
.
.
.
app
app:chat-server チャットサーバー
.
.
.
サーバー起動はいつも通りの以下コマンドで実行できます。
> 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
ハンドラーを以下のように修正します。
以下のコメントで囲んでいる部分が元のソースです。
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
内で以下の定義を追加してサーバー起動します。
'socket-manager-log' => [
'driver' => 'daily',
'path' => storage_path('logs/bat/socket-manager-log/laravel.log'),
'level' => 'debug',
'days' => 0,
],
> 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以降で動作している環境であれば問題ないと思います。