ServBayでWorkermanアプリケーションを構築・実行する
概要
本ドキュメントでは、ServBayユーザーがmacOSのローカル開発環境上で、ServBayに統合されたPHP環境とComposerを活用し、Workermanベースの高性能非同期ネットワークアプリケーションを素早く構築・実行する方法を解説します。Workermanは高並列処理が必要なWebサーバーやリアルタイム通信サーバー、ゲームサーバーなど、様々な用途で活躍する強力なPHPライブラリです。ServBayは開発環境のセットアップを大幅に簡略化し、すぐに使えるプラットフォームを提供します。
Workermanとは?
Workermanは、完全にPHPだけで実装された高性能・非同期型オープンソースネットワーク通信フレームワークです。EventLoop(イベントループ)機構を基盤とした非同期・ノンブロッキングI/Oにより、大量の並列接続を効率よく処理できます。従来のPHP Web開発(Apache/Nginx+PHP-FPM)のような受動的実行とは異なり、Workermanアプリケーションは常駐プロセスとして特定ポートをリッスンし、直接接続とデータ処理を担います。これにより、従来方式で発生するリクエストごとのプロセス終了・初期化のオーバーヘッドを排除し、パフォーマンスとスループットを飛躍的に向上させます。
Workermanを利用することで、次のようなシステムを容易に構築できます:
- 高性能なHTTPサーバー(シンプルな静的・動的リクエストならApache/Nginxの代替も可能)
- リアルタイムWebSocketサーバー(チャット、プッシュ通知などリアルタイムアプリに最適)
- カスタムTCP/UDPプロトコルサーバー
- コマンドラインツール、スケジュールタスク、マイクロサービスなど
Workermanの主な特徴と利点
- 高性能: イベント駆動・非同期ノンブロッキングI/Oにより、大量接続を効率処理し、優れたパフォーマンスを実現します。
- 複数プロトコル対応: HTTP、WebSocket、TCP、UDPなど主流ネットワークプロトコルを標準でサポートし、柔軟なカスタムプロトコル拡張も可能です。
- 使いやすさ: シンプルで直感的なAPIを提供し、PHP開発者が非同期ネットワーク開発を手軽に始められます。
- 拡張性・スケーラビリティ: マルチプロセスモデルによりマルチコアCPUの活用や負荷分散も容易。Composerや既存PHPライブラリとの統合も簡単です。
- PHPエコシステムとの親和性: PHPライブラリのためComposerによる依存管理とシームレスな統合が可能です。
- デーモンモード対応: バックグラウンドで安定稼働するデーモンモードをサポートし、本番運用も安心です。
Workermanにより、PHP開発者は高性能・リアルタイム・高並列ネットサービスの構築という新たな扉を開くことができます。
ServBayでWorkerman開発環境を構築する
ServBayはWeb開発者向けのローカル開発環境ツールであり、PHP、Node.js、Python、Go、Javaなどのランタイム、さらにCaddy、Nginx、ApacheなどのWebサーバー、MySQL、PostgreSQL、MongoDB、Redis、Memcachedといった主要データベースも統合しています。中でもComposer環境を標準搭載・設定済みで、Workermanプロジェクトのセットアップと実行が非常にスムーズです。
本ガイドでは以下の基本例を通して、ServBayでWorkermanアプリケーション(HTTPサーバー、WebSocketサーバー、TCPサーバー)を迅速に構築&実行する手順を説明します。
TIP
管理やプロジェクト構成統一のため、ServBayでは全ローカルWebプロジェクトファイルを /Applications/ServBay/www
ディレクトリ下に配置することを推奨しています。本ガイドのパス例もこのディレクトリを前提としています。
前提条件
開始前に、以下を満たしていることを確認してください。
- ServBayをインストールし、起動済みであること: ServBay公式サイト から最新版をダウンロード・インストールしてください。
- ServBayのPHPが有効化されていること: ServBayコントロールパネルで、目的のPHPバージョンが有効化されているか確認してください。WorkermanはPHP 5.4以降が必須ですが、推奨バージョンはPHP 7.xまたは8.xです。
- PHPの基礎知識とコマンドラインの操作力があること: 基本的なPHP文法や、ターミナルでコマンド操作ができることが必要です。
Workermanのインストール
1. Composerの利用確認
ServBayにはComposerが標準搭載されているため、追加インストールは不要です。ServBayが起動し、目的のPHPバージョンが有効化されている状態であれば、自動で適切なComposer環境も準備されます。ServBayのターミナルや外部ターミナル(パス設定済みの場合)からComposerを利用できます。
ターミナルを開き、次のコマンドでComposerが正しく利用可能かチェックします:
bash
composer -v
1
Composerのバージョン情報が表示されればOKです。もし「コマンドが見つかりません」と表示される場合、ServBayが起動しているか、PHPバージョンが有効かをご確認ください。
2. プロジェクトディレクトリ作成
サイトのルートディレクトリで推奨されている場所に移動し、新しいプロジェクトディレクトリを作成し、その中へ入ります:
bash
cd /Applications/ServBay/www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
1
2
3
2
3
ここでは servbay-workerman-demo
という名前のディレクトリを作成して、Workermanプロジェクトファイルを格納します。
3. ComposerでWorkermanをインストール
プロジェクトディレクトリ(/Applications/ServBay/www/servbay-workerman-demo
)で下記コマンドを実行してWorkermanライブラリをインストールします。Composerが依存関係も自動解決します:
bash
composer require workerman/workerman
1
ComposerによりWorkermanおよびその依存パッケージが vendor
ディレクトリに自動的にインストールされます。
Workerman HTTPサーバーの作成
HTTPサーバーはWorkermanで最もよく利用される用途の一つです。高性能WebアプリやAPIサービス構築にも最適です。
プロジェクトディレクトリ内で http_server.php
(または任意のファイル名、例えば server.php
)というPHPファイルを作成し、次のコードを追加してください:
php
<?php
// Composerの自動ローダーファイルを読み込み、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番ポートで待受
// 0.0.0.0=ローカル・LAN内からのアクセスを許可。8080=リッスンするポート番号
$http_worker = new Worker('http://0.0.0.0:8080');
// Workerプロセス数を設定
// ここでは4個の独立したPHPプロセスでリクエスト処理。CPUコア数に応じて調整可能
$http_worker->count = 4;
// クライアントからのメッセージ(HTTPリクエスト)受信時の処理ロジックを定義
// $connection=現在の接続オブジェクト(クライアントへ応答送信に利用)
// $request=リクエスト詳細情報(URL、ヘッダー、ボディ等を含む)
$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の自動ローダーでWorkerman等のクラスをロードします。use Workerman\...;
: 必要なクラスをインポート。new Worker('http://0.0.0.0:8080')
: Workermanインスタンスを生成。プロトコルとアドレス指定。$http_worker->count = 4;
: 起動するWorkerプロセス数(マルチプロセスで高並列性実現)。$http_worker->onMessage = function(...) {...};
: 完全なHTTPリクエスト受信時のコールバック関数を設定。$connection
は応答送信、$request
はリクエスト内容格納。Response
で標準HTTPレスポンスを生成。Worker::runAll();
: Workermanイベントループを開始し、全Workerで接続受付&処理を実行。
Workerman HTTPサーバーの起動
プロジェクトディレクトリ(/Applications/ServBay/www/servbay-workerman-demo
)で、ターミナルを開き、次のコマンドでHTTPサーバーをスタートします:
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
(停止→再起動) - なめらか再起動:
php http_server.php reload
(コード更新などに。子プロセスを順次再起動) - 状況確認:
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; // 8081番ポートでWebSocketサーバーを作成 // 'websocket://0.0.0.0:8081'はWebSocketサーバーインスタンス // WorkermanがWebSocketハンドシェイク処理も自動管理 $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"; }; // メッセージ受信時の処理 $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
39WebSocketサーバーの起動
プロジェクトディレクトリで以下コマンドを実行:
bashphp websocket_server.php start
1-d
オプションを付ければ背景実行も可能です。起動後、WebSocketクライアントからws://localhost:8081
へ接続できます。例:ブラウザのデベロッパーツールConsoleで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; // 8082番TCPサーバー作成 // 'tcp://0.0.0.0:8082'はWorkermanの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"); }; // メッセージ受信時 $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
35TCPサーバーの起動
プロジェクトディレクトリで下記コマンドを実行:
bashphp tcp_server.php start
1-d
オプションでデーモン実行もできます。起動後、TCPクライアント(telnet、nc等)でlocalhost:8082
へ接続可能。例:macOS/Linuxで新たなターミナルを開き、
telnet
またはnc
コマンドを利用:bash# telnetの場合 telnet localhost 8082 # またはnc(netcat)の場合 nc localhost 8082
1
2
3
4
5接続するとサーバーからウェルカムメッセージが返り、任意のテキスト(改行区切り)入力でメッセージのエコーバックも確認できます。
注意事項
- ポートの競合: Workermanがリッスンするポート(例:8080, 8081, 8082)がmacOSやServBay他サービスにより利用中の場合、サーバー起動時にエラーとなります。
lsof -i :ポート番号
で使用状況を確認してください。 - ファイアウォール: macOSの内蔵ファイアウォールで外部デバイスからのアクセスが制限される場合があります。他端末からの動作確認時に必要に応じて設定変更してください。
- ServBay Webサーバーとの関係: Workermanは独自ポートで自身がサーバープロセスとして稼働します。ServBayのCaddy/Nginxなどとは別個のサービスです。長時間接続・高並列・非同期処理(WebSocket等)にWorkerman、従来の短期的なHTTP処理はCaddy/Nginxが適します。もちろんリバースプロキシ等で両者を組み合わせることも可能です。
- PHPバージョン: Workermanを利用するPHPバージョンが規定を満たしていることを確認してください。ServBayでは複数バージョンが利用可能なので、ニーズに応じて切り替えられます。
- 拡張モジュール依存: Workermanは最良のパフォーマンス・機能のために
event
拡張(存在時は自動で最適化)、posix
・pcntl
(マルチプロセス対応)が推奨されます。ServBayでは多くの拡張が標準有効化されていますが、問題発生時は該当PHPバージョンの拡張状況をご確認ください。 - ログ: デーモンモード時は標準出力がログファイルに記録されます。アプリ運用・エラー監視のためにも定期確認を推奨します。
よくある質問(FAQ)
- Q: Workermanサーバーの停止方法は?
- A: フォアグラウンド(
start
)実行中は、ターミナルでCtrl+C
で停止できます。デーモンモード(start -d
)時は、プロジェクトディレクトリでphp your_server_file.php stop
コマンドで停止します。
- A: フォアグラウンド(
- Q: Workermanサーバーが起動しない場合は?
- A: 多くはポート競合が原因です。エラー内容を確認し、必要に応じて未使用ポートへ変更、または該当プロセスを停止してください。
lsof -i :ポート番号
でポート使用状況を調べられます。
- A: 多くはポート競合が原因です。エラー内容を確認し、必要に応じて未使用ポートへ変更、または該当プロセスを停止してください。
- Q: ServBayのCaddy/NginxとWorkermanの違い・使い分けは?
- A: Caddy/Nginxは従来型WebサーバーでHTTP(S)リクエスト処理向け、PHP-FPMと連携しリクエスト単位でプロセスをプールします。WorkermanはPHP非同期ネットワークフレームワークでHTTPサーバーはもちろんWebSocket, TCP等のプロトコルも処理。常駐型で高並列・リアルタイム処理に強いのが特徴です。用途(Web/RESTはCaddy/Nginx、チャット等はWorkerman)で使い分けてください。リバースプロキシ併用も可能です。
- Q: ServBayで複数のWorkermanアプリを同時起動できますか?
- A: 可能です。各アプリを独立したPHPプロセスとして起動し、異なるポートでリッスンすれば大丈夫です。個別の起動スクリプトを用意し、各ターミナルやデーモンで
php your_app_server.php start
を実行してください。ポート競合にのみ注意しましょう。
- A: 可能です。各アプリを独立したPHPプロセスとして起動し、異なるポートでリッスンすれば大丈夫です。個別の起動スクリプトを用意し、各ターミナルやデーモンで
まとめ
本ガイドで、ServBayという生産的なローカル開発環境の上で、Workermanプロジェクトを迅速に構築・実行する方法をご紹介しました。Workermanは、高パフォーマンスかつ非同期処理対応で、PHP開発者に次世代ネットワークアプリ構築のための強力なツールを提供します。ServBayの「すぐに使える」Composer・PHP環境と組み合わせることで、面倒な環境構築から解放され、ビジネスロジックの開発に集中できます。高性能WebサービスやリアルタイムWebSocketアプリの開発に、ServBayはWorkerman開発の最良のローカルパートナーとなるでしょう。この記事が、あなたのWorkerman活用の第一歩となれば幸いです。