LoginSignup
0
0

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

Last updated at Posted at 2024-06-01

はじめに

新規プロジェクトで開発を行う場合は、ある程度のソケット通信の知識が必要になりますのであらかじめご了承ください。

初心者向けにはWebscoketサーバーの開発環境をご用意していますので以下の記事をご覧ください。

また、以下のページをご覧になった上で進めていただいた方が用語の理解も含めてより効率的に進められます。

ここでは以下の記事のソースを例に挙げながらphp workerコマンドを使って新規のクラスを作っていきます。このソースを参考にしつつ、ある程度処理の流れを掴んでから進めていくのがスムーズかと思います。

環境

プラットフォーム
Windows10
統合環境
Xampp v3.3.0
言語
PHP v8.2.4(v8.1.0以降)

ここではXAMPP環境を使っている前提で説明していますが、デフォルトとは別の場所に格納している場合やLinux等の別の環境で利用されている場合は適宜読み替えてください。

インストール

以下のコマンドでインストールできます。

新規プロジェクト開発環境のインストール
> composer create-project socket-manager/new-project <インストール先のディレクトリ名>

GitHubから直接ダウンロードされる場合は以下のページからどうぞ。


インストールが完了すると以下のディレクトリ構成になります。
プロジェクトの構成
/app
    /InitClass          初期化クラス
    /UnitParameter      UNITパラメータクラス
    /ProtocolUnits      プロトコルUNIT定義クラス
    /CommandUnits       コマンドUNIT定義クラス
    /MainClass          メイン処理クラス
/logs                   ログ出力用

php workerコマンドを実行すると以下のようなUsageが表示されます。

Usage表示
> php worker

SOCKET-MANAGER Framework 1.0.0

Usage:
  command [arguments]

 main
  Empty...
 craft
  craft:init <初期化クラス名>                     初期化クラスの生成
  craft:parameter <UNITパラメータクラス名>        UNITパラメータクラスの生成
  craft:protocol <プロトコルUNIT定義のクラス名>   プロトコルUNIT定義のクラスとステータス名Enumの生成
  craft:command <コマンドUNIT定義のクラス名>      コマンドUNIT定義のクラスとキュー/ステータス名Enumの生成
  craft:main <メイン処理のクラス名>               メイン処理クラスの生成
  craft:setting <設定ファイル名>                  設定ファイルの生成
  craft:locale <メッセージファイル名>             メッセージファイルの生成

laravel:commandコマンドに関してはLaravel環境でしか表示されません。

それでは動作確認のため、以下のコマンドを実行してメイン処理クラスを作成します。
今回はMainForTestという名前で作成します。

以下のように表示されれば成功です。

MainForTestクラス作成
> php worker craft:main MainForTest

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

再度php workerを実行してみます。

Usage表示
> php worker

SOCKET-MANAGER Framework 1.0.0

Usage:
  command [arguments]

 main
  app:main-for-test                              Command description
 craft
  craft:init <初期化クラス名>                     初期化クラスの生成
  craft:parameter <UNITパラメータクラス名>        UNITパラメータクラスの生成
  craft:protocol <プロトコルUNIT定義のクラス名>   プロトコルUNIT定義のクラスとステータス名Enumの生成
  craft:command <コマンドUNIT定義のクラス名>      コマンドUNIT定義のクラスとキュー/ステータス名Enumの生成
  craft:main <メイン処理のクラス名>               メイン処理クラスの生成
  craft:setting <設定ファイル名>                  設定ファイルの生成
  craft:locale <メッセージファイル名>             メッセージファイルの生成

アプリ名main-for-testという名前で登録されている事が確認できます。
まずは以下のコマンドを実行して今回作成したサーバーを起動した状態にしてください。

サーバー起動
> php worker app:main-for-test 10000

その後PowerShellなどで以下のようにnetstatコマンドを実行して10000ポートがListenされている事が確認できれば正常にインストールされています。

Listenポート確認
> netstat -ano | Select-String -Pattern "127.0.0.1:10000"

  TCP         127.0.0.1:10000        0.0.0.0:0              LISTENING       21536

craftコマンドの種類

上記のUsageでご覧いただいた通りcraftコマンドには5種類あります。
新規で開発する場合はこれらのコマンドを使って新しいクラスを作っていく事になります。
以降ではこのcraftコマンドの使い方を簡単にみていきます。

初期化クラスの作成

InitForTestという名前で作成する場合、以下のように表示されれば成功です。

初期化クラスの作成
> php worker craft:init InitForTest

[success] 初期化クラスの生成に成功しました (InitForTest)
生成されるファイル
/app
    /InitClass
        InitForTest.php

初期化クラスではログ出力・シリアライザー・コマンドディスパッチャーなど、フレームワーク内で共通で利用するハンドラーを定義します。

プロトコル処理の作成

ProtocolForTestという名前で作成する場合、以下のように表示されれば成功です。

プロトコル処理の生成
> php worker craft:protocol ProtocolForTest

[success] プロトコルUNITクラスの生成に成功しました (ProtocolForTest)
[success] プロトコルUNITのキュー名Enumの生成に成功しました (ProtocolForTestQueueEnum)
[success] プロトコルUNITのステータス名Enumの生成に成功しました (ProtocolForTestStatusEnum)
生成されるファイル
/app
    /ProtocolUnits
        ProtocolForTest.php
        ProtocolForTestQueueEnum.php
        ProtocolForTestStatusEnum.php

この部分の実装は主にソケットプロトコルに関係する送受信の処理を行うところで、実際の通信処理はこのプロトコル部で行います。

コマンド処理の作成

CommandForTestという名前で作成する場合、以下のように表示されれば成功です。

コマンド処理の生成
> php worker craft:command CommandForTest

[success] コマンドUNITクラスの生成に成功しました (CommandForTest)
[success] コマンドUNITのキュー名Enumの生成に成功しました (CommandForTestQueueEnum)     
[success] コマンドUNITのステータス名Enumの生成に成功しました (CommandForTestStatusEnum)
生成されるファイル
/app
    /CommandUnits
        CommandForTest.php
        CommandForTestQueueEnum.php
        CommandForTestStatusEnum.php

コマンド処理はクライアント側とコマンド単位でのデータのやり取りを行って、コマンドの解釈とその内容に応じたレスポンスを返す部分になります。

UNITパラメータクラス

ParameterForTestという名前で作成する場合、以下のように表示されれば成功です。

UNITパラメータクラスの作成
> php worker craft:parameter ParameterForTest

[success] UNITパラメータクラスの生成に成功しました (ParameterForTest)
生成されるファイル
/app
    /UnitParameter
        ParameterForTest.php

ここで言うUNITというのは、プロトコル処理やコマンド処理で実行される最小単位の処理(メソッドや関数)の事を指しています。
その処理の引数として渡されるのがUNITパラメータクラスです。
そしてこのクラスはSocketManagerParameterクラスを継承しており、その継承メソッドを使って送受信を行ったり、クライアント接続子の操作を行ったりします。

SocketManagerParameterクラスの部品については>>Referenceをご覧ください。

メイン処理クラス

MainForTestという名前で作成する場合、以下のように表示されれば成功です。

メイン処理クラスの作成
> php worker craft:main MainForTest

[success] メイン処理クラスの生成に成功しました (MainForTest)
生成されるファイル
/app
    /MainClass
        MainForTest.php

メイン処理クラスでは上記で作成した各種クラスをSocketManagerクラスへ初期設定するためのクラスと言えます。
例えば一般的な組み方をすれば以下のようになります。

メイン処理クラスの実装
$manager = new SocketManager('localhost', 10000);

// 初期化クラスの設定
$manager->setInitSocketManager(new InitForTest());

// プロトコルUNITの設定
$manager->setProtocolUnits(new ProtocolForTest());

// コマンドUNITの設定
$manager->setCommandUnits(new CommandForTest())

サーバー間通信を使ってサーバー同士で連携するマルチサーバーを作成するような場合はメイン処理クラスの内容が変わってきます。

詳しく知りたい方は以下のページをご覧ください。

マルチサーバーは以下の記事でご紹介させて頂いたデモ環境でも実装していますので、そちらのソースも併せてご覧いただければ分かり易いかと思います。

設定ファイルの作成

設定ファイルは以下のコマンドで作成できます。

設定ファイルの作成
> php worker craft:setting test

[success] 設定ファイルの生成に成功しました (test)
生成されるファイル
/setting
    test.php

作成されたソースは次の通り、空の配列のリターン値になります。

setting/test.php
return [
];

使い方

設定ファイル内の設定値を取得するヘルパー関数はLaravelと同様に使えるようにしています。
ここではtest_keyという名前の設定名を使って値を取得する場合を例に挙げます。

設定ファイルで以下のように連想配列を定義していたとします。

setting/test.php
return [
    'test_key' => 100
];

あとはプログラムの方でconfigヘルパー関数を使って以下のように取得するだけです。

configヘルパー関数で値を取得
$value = config('test.test_key', null);

変数$valueには100を返します。
関数の第一引数にはファイル名を含めたキー名をピリオド区切りで指定します。第二引数には値が取得できなかった場合のデフォルト値を指定します。

メッセージファイルの作成

メッセージ管理のコマンドはsetting/app.php内のlocale設定項目と連動します。
例えばlocaleの項目がjaの場合の挙動は以下の通りです。

メッセージファイルの作成
> php worker craft:locale test

[success] メッセージファイルの生成に成功しました (test)
生成されるファイル
/locale
    /ja
        test.php

test.phpのファイルはjaのサブディレクトリに格納されます。
作成されたソースは次の通り、空の配列のリターン値になります。

locale/ja/test.php
return [
];

使い方

メッセージファイル内のメッセージを取得するヘルパー関数はLaravelと同様に使えるようにしています。
ここではtest_keyという名前の設定名を使って値を取得する場合を例に挙げます。

メッセージファイルで以下のように連想配列を定義していたとします。

locale/ja/test.php
return [
    'test_key' => 'テストメッセージ'
];

あとはプログラムの方で__ヘルパー関数を使って以下のように取得するだけです。

__ヘルパー関数でメッセージを取得
$value = __('test.test_key');

変数$valueには「テストメッセージ」という文字列を返します。

また、以下のようにプレースホルダも使えます。

locale/ja/test.php
return [
    'test_key' => '私の名前は:nameです。年齢は:age歳です。'
];
プレースホルダを使ってメッセージを取得
$value = __('test.test_key', ['name' => '山田太郎', 'age' => 20]);

変数$valueには「私の名前は山田太郎です。年齢は20歳です。」という文字列を返します。

おわりに

基本的な作り方はデモ環境を参考にして頂ければ進めやすいかと思いますが、ここではコマンドの使い方を中心にさらっと流しているだけですので、さらに詳細な内容をお知りになりたい場合は以下のページをご覧ください。

ここでご紹介したプロジェクトはLaravelと連携できます。
ご興味のある方は以下の記事をご覧ください。

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