-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathipc.html
More file actions
424 lines (329 loc) · 25.8 KB
/
ipc.html
File metadata and controls
424 lines (329 loc) · 25.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>IPC(プロセス間通信) | SOCKET-MANAGER Framework For PHP</title>
<meta name="description" content="SOCKET-MANAGER Framework における IPC(プロセス間通信)アーキテクチャを解説。CycleDrivenManager による統一インターフェースにより、プロトコル部/コマンド部と IPC モジュールを同一イベントループで共存させ、CUEI の I を中心に C・U・E と連携する柔軟な通信基盤を実現。" />
<meta name="keywords" content="SOCKET-MANAGER, IPC, プロセス間通信, CycleDrivenManager, プロトコル部, コマンド部, CUEI, Event Architecture, モジュール共存, 非同期処理, マイクロサービス, SimpleSocket, Launcher, PHP フレームワーク" />
<link rel="canonical" href="https://socket-manager.github.io/document/ipc.html" />
<script async src="https://www.googletagmanager.com/gtag/js?id=G-LF9W695NNW"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-LF9W695NNW');
</script>
<link rel="icon" href="https://socket-manager.github.io/document/favicon.ico" type="image/x-icon" />
<link type="text/css" rel="stylesheet" href="./css/common.css" media="all" />
<script src="./js/jquery-3.7.1.min.js"></script>
<script type="text/javascript" src="./js/common.js"></script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "TechArticle",
"headline": "SOCKET-MANAGER Framework - IPC Architecture and Inter-Module Communication",
"description": "SOCKET-MANAGER Framework における IPC(プロセス間通信)アーキテクチャを解説。CycleDrivenManager による統一インターフェースにより、プロトコル部/コマンド部と IPC モジュールを同一イベントループで共存させ、CUEI の I を中心に C・U・E と連携する柔軟な通信基盤を実現。",
"keywords": "SOCKET-MANAGER, IPC, プロセス間通信, CycleDrivenManager, プロトコル部, コマンド部, CUEI, Event Architecture, モジュール共存, 非同期処理, マイクロサービス, SimpleSocket, Launcher, PHP フレームワーク",
"articleSection": ["IPC Architecture", "Inter-Process Communication", "CUEI Architecture", "Event Architecture", "Advanced Architecture"],
"author": {
"@type": "Person",
"name": "SOCKET-MANAGER開発チーム"
},
"publisher": {
"@type": "Organization",
"name": "SOCKET-MANAGER",
"logo": {
"@type": "ImageObject",
"url": "https://socket-manager.github.io/document/logo.png",
"width": 355,
"height": 50
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://socket-manager.github.io/document/ipc.html"
},
"url": "https://socket-manager.github.io/document/ipc.html",
"breadcrumb": {
"@type": "BreadcrumbList",
"itemListElement": [{
"@type": "ListItem",
"position": 1,
"name": "Framework Top",
"item": "https://socket-manager.github.io/document/"
},{
"@type": "ListItem",
"position": 2,
"name": "IPC(プロセス間通信)",
"item": "https://socket-manager.github.io/document/ipc.html"
}]
},
"isPartOf": {
"@type": "WebSite",
"name": "フレームワークのご紹介",
"url": "https://socket-manager.github.io/document/"
}
}
</script>
</head>
<body>
<div class="layout">
<div class="menu" role="navigation" aria-label="ページメニュー">
<h2 class="menu-title">SOCKET-MANAGER</h2>
<h4 class="menu-reference menu-page-title-bottom"><a href="./reference/" target="_blank">>> Reference</a></h4>
<h2 class="menu-label">MAIN-MENU</h2>
<div class="menu-text">
<h3 class="menu-page-title-link"><a href="./">▶フレームワークのご紹介</a></h3>
<h3 class="menu-page-title-link"><a href="./event-handler.html">▶イベントハンドラについて</a></h3>
</div>
<h3 class="menu-label-sub">IMPLEMENT</h3>
<div class="menu-text">
<h3 class="menu-page-title-link"><a href="./init-class.html">▶初期化クラス</a></h3>
<h3 class="menu-page-title-link"><a href="./unit-parameter.html">▶UNITパラメータクラス</a></h3>
<h3 class="menu-page-title-link"><a href="./protocol-unit.html">▶プロトコルUNITクラス</a></h3>
<h3 class="menu-page-title-link"><a href="./command-unit.html">▶コマンドUNITクラス</a></h3>
<h3 class="menu-page-title-link"><a href="./main.html">▶メイン処理クラス</a></h3>
<h3 class="menu-page-title-link"><a href="./setting.html">▶設定ファイル</a></h3>
<h3 class="menu-page-title-link"><a href="./message.html">▶メッセージファイル</a></h3>
</div>
<div class="menu-line"></div>
<div class="menu-text">
<h3 class="menu-page-title-link-for-runtime-manager"><a href="./runtime-manager/" target="_blank">>> ランタイムライブラリ</a></h3>
<h3 class="menu-page-title-link-for-runtime-manager"><a href="./simple-socket/" target="_blank">>> シンプルソケット機能</a></h3>
</div>
<h3 class="menu-label-sub">ADVANCED</h3>
<div class="menu-text">
<h3 class="menu-page-title-link"><a href="./architecture.html">▶アーキテクチャ</a></h3>
<h3 class="menu-page-title-link"><a href="./event.html">▶イベント駆動アーキテクチャ</a></h3>
<h3 class="menu-page-title">▼IPC(プロセス間通信)</h3>
<ul>
<li><a href="./ipc.html#begin">はじめに</a></li>
</ul>
<ul>
<li><a href="./ipc.html#module">モジュール構造と IPC の関係</a></li>
</ul>
<ul>
<li><a href="./ipc.html#concept">IPC を特別扱いしない思想</a></li>
</ul>
<ul>
<li><a href="./ipc.html#cuei-ipc">CUEI各要素との相関関係</a></li>
</ul>
<ul>
<li><a href="./ipc.html#strategy">依存性注入と戦略パターン</a></li>
</ul>
<ul>
<li><a href="./ipc.html#microservice">マイクロサービスとの親和性</a></li>
</ul>
<ul>
<li><a href="./ipc.html#launcher">Launcher 統合管理</a></li>
</ul>
<ul>
<li><a href="./ipc.html#simple">SimpleSocket の横断的利用</a></li>
</ul>
<ul>
<li><a href="./ipc.html#example">IPC の実例</a></li>
</ul>
<ul>
<li><a href="./ipc.html#clean">ビジネスロジックが汚れない</a></li>
</ul>
<ul>
<li><a href="./ipc.html#rest">REST-API 環境との関係</a></li>
</ul>
<ul>
<li><a href="./ipc.html#last">おわりに</a></li>
</ul>
<h3 class="menu-page-title-link"><a href="./multi-server.html">▶マルチサーバーの構成</a></h3>
<h3 class="menu-page-title-link"><a href="./tcp-and-udp.html">▶TCP/UDP通信について</a></h3>
<h3 class="menu-page-title-link"><a href="./laravel.html">▶Laravelと連携する</a></h3>
<h3 class="menu-page-title-link"><a href="./system-setting.html">▶システム設定ファイル</a></h3>
<h3 class="menu-page-title-link"><a href="./system-setting.html">▶カスタムコマンド作成機能</a></h3>
</div>
<h3 class="menu-label-sub">OTHER-PROJECT</h3>
<div class="menu-text">
<h3 class="menu-page-title-link"><a href="./new-project.html">▶新規開発環境</a></h3>
<h3 class="menu-page-title-link"><a href="./websocket.html">▶Websocketサーバー開発環境</a></h3>
<h3 class="menu-page-title-link"><a href="./dev-ops.html">▶フレームワークのDevOps環境</a></h3>
</div>
<div class="menu-line"></div>
<div class="menu-text">
<h3 class="menu-page-title-link-for-minecraft"><a href="./minecraft-contents/" target="_blank">>> マインクラフト専用環境</a></h3>
<h3 class="menu-page-title-link-for-launcher"><a href="./launcher/" target="_blank">>> GUI & CLI ランチャー</a></h3>
<h3 class="menu-page-title-link-for-rest-api"><a href="./rest-api/" target="_blank">>> REST-APIサーバー開発環境</a></h3>
</div>
<h2 class="menu-label">EXTRA-MENU</h2>
<div class="menu-text">
<h3 class="menu-page-title-link"><a href="./extra-demo.html">▶デモサーバーの種類</a></h3>
<h3 class="menu-page-title-link"><a href="./extra-demo-command.html">▶デモのコマンド仕様</a></h3>
<h3 class="menu-page-title-link"><a href="./extra-demo-setting.html">▶デモの設定ファイル</a></h3>
<h3 class="menu-page-title-link"><a href="./extra-minecraft.html">▶マインクラフトの通信仕様</a></h3>
<h3 class="menu-page-title-link"><a href="./extra-close-frame.html">▶切断フレームの検証</a></h3>
</div>
<h2 class="menu-label">PHP-TECHNIQUE</h2>
<div class="menu-text">
<h3 class="menu-page-title-link"><a href="./php-pass-by-reference.html">▶参照渡し</a></h3>
<h3 class="menu-page-title-link"><a href="./php-phpdoc.html">▶PHPDocのフォーマット</a></h3>
</div>
<div class="menu-dummy-for-framework"></div>
</div>
<div class="main" role="main">
<h1>【IPC(プロセス間通信)】</h1>
<a id="begin"></a>
<h2 class="subtitle">はじめに</h2>
<div class="text-block">
SOCKET-MANAGER Framework は、TCP / UDP / WebSocket / 独自プロトコルといった<strong>異なる通信方式を同一プロセス内で共存させる</strong> という特徴的なアーキテクチャを持っています。<br /><br />
この構造は単なる「複数プロトコル対応」ではなく、<strong>IPC(プロセス間通信)を特別扱いせずに自然に実現できる</strong>という大きな利点につながります。<br /><br />
本ページでは、SOCKET-MANAGER Framework の基盤思想の一部であるIPC(プロセス間通信)とモジュール構造の関係について解説します。<br />
フレームワーク全体の構成や主要機能については、<font><a href="./">▶フレームワークのご紹介</a></font> をご覧ください。<br />
</div><br />
<a id="module"></a>
<h2 class="subtitle">モジュール構造と IPC の関係</h2>
<div class="text-block">
フレームワーク本体は以下の 3 モジュールで構成されています。<br /><br />
<ul>
<li><strong>SocketManager</strong>(プロトコル部+コマンド部)</li>
<li><strong>RuntimeManager</strong>(ランタイムUNITのみ)</li>
<li><strong>SimpleSocket</strong>(TCP/UDP の軽量通信)</li>
</ul>
これらはすべて、<strong>UNIT(処理単位)とキュー(状態遷移)</strong> による共通のステートマシン上で動作します。<br /><br />
そのため、<strong>異なるモジュールを同一プロセス内で自由に組み合わせることができる</strong> という柔軟性が生まれます。<br />
この「モジュールの共存性」こそが IPC の基盤になっています。<br />
</div><br />
<a id="concept"></a>
<h2 class="subtitle">IPC を“特別扱いしない”という設計思想</h2>
<div class="text-block">
一般的なフレームワークでは、IPC は以下のように「別世界」として扱われがちです。<br /><br />
<ul>
<li>専用の IPC ライブラリ</li>
<li>専用のメッセージング層</li>
<li>専用のプロトコル</li>
<li>専用のハンドラ</li>
</ul>
しかし SOCKET-MANAGER Framework では、<strong>IPC も単なる「通信モジュールの一つ」</strong> として扱います。<br /><br />
つまり、<strong>IPC 専用の仕組みを作らなくても、通常の通信モジュールを複数プロセスに配置するだけで IPC が成立する</strong> という構造になっています。<br />
</div><br />
<a id="cuei-ipc"></a>
<h2 class="subtitle">CUEI各要素との相関関係</h2>
<div class="text-block">
IPC(プロセス間通信)は CUEI アーキテクチャにおける
<strong>I(IPC)</strong> の役割を担う要素です。<br /><br />
SOCKET-MANAGER Framework では、プロトコル部とコマンド部が
CycleDrivenManager により統一インターフェースで扱われるため、
IPC も通常の通信モジュールと同じ抽象モデルで実現できます。<br /><br />
また、イベント駆動アーキテクチャ(E)の上で動作するため、
<strong>サーバー本体のモジュールと IPC モジュールを同じイベントループ内で共存させる</strong>
ことが可能です。<br /><br />
<ul>
<li><strong>C(Communication)</strong>:プロトコル部が抽象化され、IPC も通常通信と同じモデルで扱える</li>
<li><strong>U(Union)</strong>:共有基盤(UNITパラメータ)がプロセス間でも統一的に利用される</li>
<li><strong>E(Event)</strong>:複数モジュールを同一イベントループで安全に共存させる</li>
<li><strong>I(IPC)</strong>:追加の仕組みなしでプロセス間通信を構成できる</li>
</ul><br />
このように、IPC は CUEI の I を担いながら、
C・U・E の要素と統合されることで高い柔軟性と拡張性を実現しています。<br /><br />
イベントループとステートマシンによる E(Event)の詳細については、
<font><a href="./event.html">▶イベント駆動アーキテクチャ</a></font> を参照してください。<br />
</div><br />
<a id="strategy"></a>
<h2 class="subtitle">依存性注入と戦略パターン</h2>
<div class="text-block">
フレームワーク本体は、<strong>ストラテジーパターンを基盤とした依存性注入(DI)</strong> を採用しています。<br /><br />
これにより、以下のような柔軟な構成が可能になります。<br /><br />
<ul>
<li>プロトコル部・コマンド部をクラス単位で自由に差し替え</li>
<li>同一インターフェースで複数モジュールを共存</li>
<li>IPC 用モジュールを必要なプロセスにだけ注入</li>
</ul>
この DI 構造は、IPC を「後付けの特殊機能」ではなく、<strong>モジュール構成の一部として自然に扱える</strong> という大きな利点を生みます。<br /><br />
なお、依存性注入(DI)やインターフェース設計の思想については、PHP-FIG が策定する PSR-11(Container Interface)も参考になります:<br />
<a href="https://www.php-fig.org/psr/psr-11/" target="_blank">https://www.php-fig.org/psr/psr-11/</a><br />
</div><br />
<a id="microservice"></a>
<h2 class="subtitle">マイクロサービスとの親和性</h2>
<div class="text-block">
モジュールをプロセス単位で自由に構成できるため、SOCKET-MANAGER Framework は<strong>マイクロサービスアーキテクチャと非常に相性が良い</strong> という特徴があります。<br /><br />
<ul>
<li>サービスごとに異なるプロトコルを採用可能</li>
<li>IPC モジュールを介してサービス間通信を統一</li>
<li>プロセス単位でスケールアウトが容易</li>
<li>Launcher による複数サーバーの一元管理</li>
</ul>
これらはすべて、<strong>UNIT / キュー / モジュール</strong> という統一抽象モデルがあるからこそ成立する設計です。<br /><br />
また、イベント駆動型のサービス連携という観点では、PSR-14(Event Dispatcher)も関連する設計思想として参考になります:<br />
<a href="https://www.php-fig.org/psr/psr-14/" target="_blank">https://www.php-fig.org/psr/psr-14/</a><br />
</div><br />
<a id="launcher"></a>
<h2 class="subtitle">Launcher 統合管理</h2>
<div class="text-block">
SOCKET-MANAGER Launcher は、フレームワーク本体と同じく
<strong>UNIT / キュー を基盤としたステートマシン構造</strong> を採用しています。<br /><br />
そのため、サービス群を Launcher から統一的に管理でき、<strong>システム全体をステータス管理対象として扱える</strong> という強みがあります。<br /><br />
<ul>
<li>各サービスの起動・停止・再起動を一元管理</li>
<li>サービスごとのステータスを統一フォーマットで監視</li>
<li>IPC を利用したサービス間連携を俯瞰的に把握</li>
<li>サービス群を「統合ステートマシン」として運用可能</li>
</ul>
なお、SOCKET-MANAGER Launcher は、アーキテクチャページで説明している<strong>CUEI/O アーキテクチャにおける “/O(Operation)”</strong> に該当する要素でもあります。<br />
CUEI が示す「通信・共有基盤・非同期処理・サーバー間通信」を開発フェーズで統合する思想に対し、Launcher はそれらを <strong>運用フェーズで統合的に管理する役割</strong> を担います。<br /><br />
そのため、IPC を含む複数サービスの起動・停止・監視・再起動といった運用レベルの制御を、CUEI の抽象モデルと同じ思想で扱える点が大きな特徴です。<br /><br />
CUEI/O 全体の構造や、CUEI の各要素がどのように統合されるかについては、
<font><a href="./architecture.html">▶アーキテクチャ</a></font> のページで詳しく解説しています。<br />
</div><br />
<a id="simple"></a>
<h2 class="subtitle">SimpleSocket の横断利用</h2>
<div class="text-block">
SimpleSocket は以下の 2 つの使い方ができます。<br /><br />
<h3 class="underline">1. 独立モジュールとして動作</h3>
Launcher のカスタムモニタリング機能がこの例です。<br /><br />
<h3 class="underline">2. 他モジュールの UNIT 内で動作</h3>
<code>$ctx->simple_socket</code>(プロパティ)により、SocketManager や RuntimeManager の UNIT 内から SimpleSocket の送受信機能を直接利用できます。<br /><br />
これにより、<strong>プロトコル部の処理中に IPC を行う</strong> といった柔軟な構成も可能になります。<br />
</div><br />
<a id="example"></a>
<h2 class="subtitle">IPC の実例</h2>
<div class="text-block">
フレームワークのデモでは、Minecraft 統合版(Bedrock Edition)との連携を含む以下の IPC 構成を実現しています。<br /><br />
<ul>
<li>TCP 版 IPC</li>
<li>UDP 版 IPC</li>
<li>Web ブラウザ同士の宛先指定メッセージ送受信</li>
<li>Web ブラウザ ⇔ Minecraft 統合版 間の宛先指定メッセージ送受信</li>
</ul>
Minecraft 側では、ゲーム内の <strong>「/w(whisper)」</strong> 機能を利用してプレイヤーへ通知を行っています。<br /><br />
Minecraft 統合版の公式ドキュメントはこちら:<br />
<a href="https://learn.microsoft.com/ja-jp/minecraft/creator/" target="_blank">
Minecraft 統合版クリエイタードキュメント
</a><br /><br />
これらはすべて、<strong>IPC 専用の仕組みではなく、通常の通信モジュールを複数プロセスに配置しただけ</strong> で成立しています。<br />
</div><br />
<a id="clean"></a>
<h2 class="subtitle">ビジネスロジックが汚れない理由</h2>
<div class="text-block">
IPC をモジュールとしてカプセル化できるため、ビジネスロジック側は以下のメリットを得ます。<br /><br />
<ul>
<li>IPC の実装がアプリロジックに混ざらない</li>
<li>モジュール単位で差し替え可能</li>
<li>テストや保守が容易</li>
<li>プロトコル変更にも強い</li>
</ul>
これは <strong>UNIT / キュー / モジュール</strong> という統一された抽象モデルがあるからこそ実現できる設計です。<br />
</div><br />
<a id="rest"></a>
<h2 class="subtitle">REST-API との関係</h2>
<div class="text-block">
REST-API 環境では、SocketManager の特定構成をプリセット化しているため、IPC の実装方法は
REST-API 側の <font><a href="./rest-api/parallel.html" target="_blank">▶Parallelクラス実装</a></font> ページ で説明しています。<br /><br />
本ページでは、<strong>フレームワーク本体としての IPC の思想と構造</strong> を扱います。
</div><br />
<a id="last"></a>
<h2 class="subtitle">おわりに</h2>
<div class="text-block">
IPC は SOCKET-MANAGER Framework のアーキテクチャから自然に導かれる仕組みであり、特別な実装を必要としない点が大きな特徴です。<br /><br />
モジュールを複数プロセスに配置するだけで IPC が成立し、SimpleSocket による横断的な通信も可能です。<br /><br />
より高度な構成(マルチサーバー構成や Launcher 連携)については、ADVANCED カテゴリの各ページをご参照ください。<br />
</div><br />
</div>
</div>
</body>
</html>