ServBayでWorkermanアプリを構築・運用する
概要
本ドキュメントでは、ServBayユーザーがmacOSおよびWindowsのローカル開発環境において、ServBayが統合するPHP環境とComposerを活用して、高性能な非同期ネットワークアプリ「Workerman」の構築・運用方法をわかりやすく解説します。Workermanは、高い同時接続を求めるWebサーバー、リアルタイム通信、ゲームサーバーなど多彩な用途に対応するパワフルなPHPライブラリです。ServBayは、面倒な環境設定不要ですぐに使える開発プラットフォームを提供し、Workerman環境のセットアップを大幅に簡素化します。
Workermanとは?
Workermanは、PHPで完全に実装されたオープンソースの高性能非同期ネットワーク通信フレームワークです。EventLoop(イベントループ)機構に基づき、非同期・ノンブロッキングI/Oを実現し、大量の同時接続を効率よく処理できます。従来のPHP Web開発(Apache/Nginx + PHP-FPM)のようなリクエストごとにプロセス破棄する形式ではなく、 Workermanアプリは常駐メモリ型で動作し、特定ポートを直接リッスンして通信・データ処理を行うため、処理のオーバーヘッドを削減し、抜群のパフォーマンスとスループットを実現します。
Workermanを使えば、以下のようなサービスを簡単に開発できます:
- 高性能HTTPサーバー(静的/動的Webリクエストのシンプル対応にNginx/Apacheの代替としても利用可能)
- リアルタイム通信やチャット、プッシュ通知を実現するWebSocketサーバー
- カスタムプロトコルに対応したTCP/UDPサーバー
- CLIツール、スケジュールジョブ、マイクロサービスなどにも応用可能
Workermanの主な特徴とメリット
- 高性能: イベント駆動型・非同期ノンブロッキングI/Oに基づき、高い同時接続処理性能を備えています。
- マルチプロトコル対応: HTTP、WebSocket、TCP、UDPなど主要ネットワークプロトコルを標準サポート。柔軟なAPIで独自プロトコルの実装にも対応。
- 使いやすさ: シンプルで直感的なAPI設計により、複雑なネットワークプログラミングもPHP開発者がすぐに使い始められます。
- 拡張性・柔軟性: マルチプロセスモデル対応で、マルチコアCPU活用による水平スケーリングや負荷分散も容易。Composerや既存PHPライブラリとの統合も簡単。
- PHPエコシステムとの融合: PHPライブラリとして提供されるため、Composerによる依存管理が可能など、PHPの既存エコシステムと密接に連携。
- デーモンモード: バックグラウンドで安定稼働するデーモンモードにも対応しており、本番環境での信頼性、持続的運用を実現。
Workermanは、PHP開発者に高性能かつリアルタイム・高同時接続ネットワークアプリ構築の新たな可能性を開きます。
ServBayによるWorkerman開発環境の構築
ServBayはWeb開発者向けのローカル開発環境ツールで、PHP・Node.js・Python・Go・Javaなど多彩な言語ランタイムに加え、Caddy・Nginx・Apache・MySQL・PostgreSQL・MongoDB・Redis・Memcachedなど主要なDB/サーバーソフトを統合しています。特にComposer環境があらかじめ設定済みの「すぐ使える」特徴があり、Workermanプロジェクトの構築と運用を劇的に楽にします。
本ガイドでは、ServBay環境でWorkermanの基本的なHTTPサーバー、WebSocketサーバー、TCPサーバーなどの例を通じて、素早くアプリを構築・動作させる手順を紹介します。
TIP
管理や規則統一のため、ServBayではすべてのローカルWebプロジェクトファイルを以下ディレクトリに保存することを推奨しています:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
本ドキュメントのサンプルパスもこのディレクトリを前提としています。
事前準備
始める前に、以下が整っているか確認してください:
- ServBayがインストール&起動済み: ServBay公式サイトから最新版を入手・インストールしましょう。
- PHPがServBayで有効化されている: ServBayコントロールパネルで利用予定のPHPバージョンが有効化済みか確認。WorkermanはPHP 5.4以上対応ですが、PHP 7.xや8.xがおすすめです。
- PHPプログラミング・コマンドライン操作の基本知識: 基本構文とターミナル操作ができることが前提です。
Workermanのインストール
1. Composerが使えることを確認
ServBayではComposerが標準搭載なので、別途インストール不要です。ServBay環境を起動し、対象PHPバージョンが有効になっていれば、自動でComposer環境も整います。ServBayの内蔵ターミナルまたは外部端末(ServBayがPATH追加済みの場合)は、PHP+Composer環境となっています。
以下コマンドでComposer利用可能か確認しましょう:
bash
composer -v
1
正常にインストールされていればバージョン情報が表示されます。もしコマンド未検出なら、ServBayやPHPの起動状況を再確認してください。
2. プロジェクト用ディレクトリを作成
推奨のWebルートディレクトリへ移動し、新規プロジェクトフォルダを作成、そのフォルダへ移動します:
macOS:
bash
cd /Applications/ServBay/www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
1
2
3
2
3
Windows:
cmd
cd C:\ServBay\www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
1
2
3
2
3
ここでは、servbay-workerman-demo
ディレクトリにWorkermanのファイルを配置します。
3. ComposerによるWorkermanインストール
作成したプロジェクトディレクトリ内で、ComposerコマンドでWorkermanライブラリをインストールします。Composerは依存関係も自動解決してくれます。
ディレクトリ例:
- macOS:
/Applications/ServBay/www/servbay-workerman-demo
- Windows:
C:\ServBay\www\servbay-workerman-demo
bash
composer require workerman/workerman
1
インストール完了すると、そのディレクトリ配下にvendor
が生成され、Workerman関連ファイルが格納されます。
Workerman HTTPサーバーコードの作成
HTTPサーバーはWorkermanの代表的な利用例で、高性能なWebアプリやAPIサービスを構築する際に活用できます。
プロジェクトディレクトリ内で、http_server.php
(またはserver.php
等好きなファイル名)を新規作成し、以下のPHPコードを記述します:
php
<?php
// Composerが自動生成するautoloadファイルを読み込むことで、Workermanの各クラスを利用可能にする
require __DIR__ . '/vendor/autoload.php';
// WorkermanのWorkerクラスなどをインポート
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
// Workerインスタンスを生成、監視プロトコルとアドレスを指定
// 'http://0.0.0.0:8080'で全ネットワークインターフェースの8080番ポートでHTTPサーバーを構築
// 0.0.0.0はローカル・LAN両方からアクセス可能、8080は待受ポート
$http_worker = new Worker('http://0.0.0.0:8080');
// Workerプロセス数を設定
// ここでは4。CPUコア数に応じて調整可能
$http_worker->count = 4;
// クライアントからメッセージ(HTTPリクエスト)を受信した時の処理ロジックを定義
// $connectionは現在の接続オブジェクトであり、レスポンス送信に利用
// $requestはリクエスト情報(URL、ヘッダー、Body等詳細)が含まれる
$http_worker->onMessage = function(TcpConnection $connection, Request $request) {
// クライアントへシンプルな文字列をHTTPレスポンスで送信
// WorkermanがHTTPヘッダー等は自動処理
$connection->send(new Response(200, [], 'Hello ServBay Workerman HTTP Server!'));
};
// 全てのWorkerインスタンスを起動
// これがWorkermanのメインループ。起動後、ポート監視とイベント処理を開始
Worker::runAll();
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
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
コード解説:
require __DIR__ . '/vendor/autoload.php';
: Composerのautoloaderを読み込むことで、Workerman関連クラスが利用可能に。use Workerman\...;
: 必要なクラスをインポート。new Worker('http://0.0.0.0:8080')
: Workerインスタンス生成。プロトコル(http)とアドレス(0.0.0.0:8080)指定。$http_worker->count = 4;
: プロセス数。多いほど並列処理・同時接続数アップ。CPUコア数目安で調整。$http_worker->onMessage = function(TcpConnection $connection, Request $request) { ... };
: HTTPリクエスト時のコールバック。$connection
は返信に、$request
はリクエスト情報取得に使用。Response
クラスでHTTPレスポンス構築。Worker::runAll();
: Workermanイベントループ(main loop)を起動。全Workerがポート監視と接続処理を開始。
Workerman HTTPサーバーの起動
プロジェクトディレクトリでターミナルを開き、以下コマンドを実行してサーバーを起動します:
ディレクトリ例:
- macOS:
/Applications/ServBay/www/servbay-workerman-demo
- Windows:
C:\ServBay\www\servbay-workerman-demo
bash
php http_server.php start
1
運用モードの説明:
- フォアグラウンド(前面)起動:
php http_server.php start
で、ターミナル上に実行ログ等を表示。Ctrl+C
で停止。主に開発・デバッグ用。 - デーモン(バックグラウンド)起動: 本番運用では
-d
オプション利用例:bash背景で動作し、ログがファイル出力されます(デフォルトはWorkermanディレクトリまたは指定パス)。php http_server.php start -d
1
プロセス管理コマンド:
Workermanは便利なプロセス管理コマンド群を提供しています:
- 起動:
php http_server.php start
(前面)/php http_server.php start -d
(バックグラウンド) - 停止:
php http_server.php stop
(現在のリクエスト完了後、優雅に終了) - 再起動:
php http_server.php restart
(停止→再起動) - 再読み込み(Reload):
php http_server.php reload
(コード更新時など、子プロセスを1つずつ再起動。サービス中断なし。但し、onWorkerStart
等ライフサイクルに注意) - ステータス確認:
php http_server.php status
(稼働状況・メモリ・接続数などを表示)
サーバー起動後、ブラウザでhttp://localhost:8080
やhttp://127.0.0.1:8080
にアクセスすれば、Hello ServBay Workerman HTTP Server!
の表示が確認できます。
WorkermanでWebSocketサーバーを作成
WebSocketは、クライアントとサーバー間で持続的な双方向通信を実現するプロトコルです。チャット・リアルタイムデータ・ゲームなどに最適。WorkermanはWebSocketにも強力に対応しています。
WebSocketサーバーコード作成
プロジェクトディレクトリに
websocket_server.php
を作成して、以下のコードを記述してください。php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // WebSocketサーバーインスタンスを生成。8081番ポートで起動 // 'websocket://0.0.0.0:8081'はWebSocket用プロトコルを示す // Workermanがハンドシェイク等を自動処理 $ws_worker = new Worker('websocket://0.0.0.0:8081'); // 4プロセスで接続を処理 $ws_worker->count = 4; // 新規接続時の処理 // 新規クライアントが接続した際に実行される $ws_worker->onConnect = function(TcpConnection $connection) { echo "New WebSocket connection from " . $connection->getRemoteIp() . "\n"; }; // メッセージ受信時の処理 // クライアントからWebSocketメッセージを受け取った際に実行 // $dataに受信したメッセージ(デコード済み)が格納される $ws_worker->onMessage = function(TcpConnection $connection, $data) { echo "Received message: " . $data . "\n"; // クライアントに受信メッセージをそのまま返信 $connection->send('ServBay Workerman received: ' . $data); }; // 接続断時の処理 // クライアントが切断した際に実行される $ws_worker->onClose = function(TcpConnection $connection) { echo "WebSocket Connection closed\n"; }; // エラー発生時の処理(任意) $ws_worker->onError = function(TcpConnection $connection, $code, $msg) { echo "Error: $code - $msg\n"; }; // 全Workerインスタンス起動 Worker::runAll();
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
43WebSocketサーバーの起動
プロジェクトディレクトリで以下コマンドを実行してサーバーを開始します:
bashphp websocket_server.php start
1-d
オプションでバックグラウンド実行も可能。ws://localhost:8081
へWebSocketクライアントで接続できます。ブラウザの開発者コンソールから、JavaScriptで簡単に動作テストできます:
javascriptvar ws = new WebSocket("ws://localhost:8081"); ws.onopen = function(event) { console.log("WebSocket connection opened"); ws.send("Hello from Browser!"); // メッセージ送信 }; ws.onmessage = function(event) { console.log("Message from server:", event.data); // メッセージ受信 }; ws.onclose = function(event) { if (event.wasClean) { console.log("WebSocket connection closed cleanly, code=" + event.code + " reason=" + event.reason); } else { console.error("WebSocket connection died"); } }; ws.onerror = function(error) { console.error("WebSocket error:", error); }; // 接続終了(任意) // ws.close();
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上記で接続・送受信が確認でき、サーバー側にもメッセージや接続状況のログが出力されます。
WorkermanでTCPサーバーを作成
Workermanは汎用TCPサーバーも得意とし、自作プロトコルのデータ通信・ゲームサーバー・IoTプラットフォーム等にも応用できます。
TCPサーバーコード作成
プロジェクトディレクトリに
tcp_server.php
を新規作成、次のコードを記述してください。php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // TCPサーバーインスタンスを生成。8082番ポートでリッスン // 'tcp://0.0.0.0:8082'はTCP用プロトコル // デフォルトはText(行末'\n')だが、他プロトコル指定や独自実装も可能 $tcp_worker = new Worker('tcp://0.0.0.0:8082'); // 4プロセスで接続処理 $tcp_worker->count = 4; // 新規接続時の処理 $tcp_worker->onConnect = function(TcpConnection $connection) { echo "New TCP connection from " . $connection->getRemoteIp() . "\n"; // 接続時にウェルカムメッセージ送信 $connection->send("Welcome to ServBay Workerman TCP Server!\n"); }; // メッセージ受信時の処理 // $dataにはクライアントから受信したTCPデータ(プロトコル解析後)が格納 $tcp_worker->onMessage = function(TcpConnection $connection, $data) { echo "Received data: " . $data; // クライアントに受信データを返信 $connection->send('ServBay Workerman received: ' . $data); }; // 接続断時の処理 $tcp_worker->onClose = function(TcpConnection $connection) { echo "TCP Connection closed\n"; }; // 全Workerインスタンス起動 Worker::runAll();
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
36TCPサーバーの起動
プロジェクトディレクトリで次のコマンドを実行してサーバーを開始します:
bashphp tcp_server.php start
1-d
オプションでバックグラウンド実行も可能。TCPクライアントツールでlocalhost:8082
へ接続できます。例:別ターミナルで、
telnet
またはnc
コマンドを使用bash# telnet利用 telnet localhost 8082 # もしくはnc(netcat) nc localhost 8082
1
2
3
4
5接続成功時にウェルカムメッセージが表示、テキスト送信(Enter/改行で実行)すればサーバーからエコーバックが返ります。
注意事項
- ポート競合: Workermanが利用するポート(本例では8080, 8081, 8082)がmacOSやServBay上の他サービスと重複しないよう注意。競合時は起動不可となりエラーになります。
lsof -i :ポート番号
コマンドで確認可能です。 - ファイアウォール: OS標準のファイアウォールが外部アクセスを遮断する場合あり。ローカル開発用途なら問題ありませんが、LAN等からアクセスが必要な場合は適切な設定を行いましょう。
- ServBayのWebサーバーとの違い: Workermanは独自にポートをリッスンするため、CaddyやNginx等ServBayが統合するWebサーバーとは「別プロセス」で独立稼働します。往々にして直接接続で利用され、逆プロキシ設定(Caddy/Nginx→Workerman)も可能ですが、WebSocket等長時間接続や高同時接続にはWorkerman、伝統的な短接続HTTPにはCaddy/Nginxと使い分けが有効です。
- PHPバージョン: ServBayでWorkermanを動作させるPHPバージョンは対応要件を満たすこと。ServBayには複数PHPを標準搭載しており、プロジェクトごとにコントロールパネルで選択・有効化できます。
- 拡張依存: Workermanの最適動作には
event
(あれば高速化)、posix
やpcntl
(マルチプロセス用途)が必要です。ServBayは主要拡張を標準で有効化していますが、動作不良時は各PHPバージョンの拡張有効化設定をご確認ください。 - ログ管理: デーモンモード運用時は、出力がログファイルに記録されます。運用状況やエラー監視で定期的にログを確認しましょう。
よくある質問(FAQ)
- Q: Workermanサーバーの停止方法は?
- A: フォアグラウンド実行時は、ターミナルで
Ctrl+C
で停止可能。デーモンモードの場合は、php your_server_file.php stop
を実行して停止してください。
- A: フォアグラウンド実行時は、ターミナルで
- Q: Workermanサーバーが起動しない場合は?
- A: 主な原因はポート競合です。エラーメッセージに注意し、別ポートへの変更や競合プロセスの停止を試しましょう。
lsof -i :ポート番号
で確認できます。
- A: 主な原因はポート競合です。エラーメッセージに注意し、別ポートへの変更や競合プロセスの停止を試しましょう。
- Q: ServBayのCaddy/NginxとWorkermanはどう違う?どっちを使うべき?
- A: Caddy/Nginxは従来型Webサーバーで、主にHTTP(HTTPS)リクエスト処理+PHP-FPMとの連携が基本です。WorkermanはPHPで非同期・高同時接続・WebSocket等にも対応できる自身がWebサーバー等になるフレームワークです。用途に応じて選択しましょう。伝統的なWebサイトやREST APIにはCaddy/Nginx、リアルタイムチャット・ゲーム等にはWorkermanが適しています。また、逆プロキシ連携も可能です。
- Q: ServBayで複数のWorkermanアプリを同時に動かせますか?
- A: 可能です。それぞれを独立したPHPプロセス&別ポートで動かせば複数同時運用できます。同一ディレクトリに複数の起動スクリプトを用意し、別ターミナルやデーモンモードで起動してください。ポート重複だけ注意しましょう。
まとめ
本ガイドに沿って、ServBayという高性能ローカル開発環境上でWorkermanプロジェクトを迅速に構築・運用する手法を習得できます。Workermanは高性能・非同期特性により、PHP開発者に次世代ネットワークアプリ開発の多彩な可能性を提供します。ServBayのComposer・PHP統合環境を活用すれば、煩雑な環境設定を気にせず、事業ロジック開発に専念でき、生産性も大幅アップ。Webサービス・WebSocket・リアルタイムアプリの構築にも最適な選択肢です。Workermanの新しい世界を、ServBayと共にぜひ楽しんでください!