ServBayでSwooleを使ったハイパフォーマンスPHPアプリの構築
ServBayは、開発者向けに設計されたローカルWeb開発環境です。複数の言語ランタイムやデータベース、各種ツールをプリインストールし、ローカル開発作業をシンプルにします。ここでは、ServBay環境でSwoole拡張を活用してPHPアプリに高性能なネットワークサービスを追加する方法をご紹介します。
Swooleとは?
Swooleは、PHP向けに設計されたコルーチンベースの並列・高性能ネットワーク通信エンジンです。C言語で開発され、PHPでの非同期・並列・コルーチン通信を実現します。Swooleを使えば、従来のWebサーバー(ApacheやNginx+PHP-FPM)のリクエスト-レスポンスモデルから脱却し、高効率で大量同時接続の処理、常駐型Webサーバーや非同期タスク処理、リアルタイム通信(WebSocket等)を実装できるようになります。
Swooleの主な特徴:
- ハイパフォーマンス: C言語による低レベル実装、非同期I/O、マルチプロセス/マルチスレッド対応。
- コルーチン: 軽量なコルーチンにより同期型記述で非同期処理を実現し、非同期プログラミングを容易に。
- 豊富なプロトコル対応: TCP/UDP/HTTP/WebSocketなど主要なネットワークプロトコルを標準サポート。
- 使いやすさ: PHP標準の記述に馴染むシンプルなAPI設計。
- 常駐プロセス: アプリを常駐型プロセスとして動作でき、従来のPHPのリクエストごとの初期化コストを削減。
Swooleによって、PHPはWeb開発用途だけでなく、より幅広いハイパフォーマンスなネットワークアプリ開発も可能になります。
ServBayでSwooleを有効化する
ServBayの設計思想のひとつは、多彩なPHP拡張機能の管理・利用を容易にすることです。PHPハイパフォーマンス開発の要となるSwoole拡張はServBayにプリインストールされており、簡単な手順で有効化できます。
前提条件:
- ServBayがインストール・起動済み
- ServBay内に少なくとも1つのPHPバージョンがインストールされていること
有効化手順:
- ServBayのアプリ画面を開く
- 「ソフトウェアパッケージ(Packages)」またはPHPバージョン管理画面へ進む
(バージョンによって表記が若干異なりますが、多くはメイン画面や設定画面にあります) - Swooleを有効化したいPHPバージョンを選択
- 拡張一覧からSwooleの項目を見つけ、チェックを入れて有効化
ServBayではコンパイル済み拡張がリストやスイッチで表示されます。 - 変更を保存し、案内に従いServBayまたは該当PHPサービスを再起動
ServBayが自動でPHP環境にSwoole拡張を組み込みます。
これで、指定したPHPバージョンでSwooleが利用可能になります。ターミナルで php -m
を実行し、swoole
が拡張一覧にあることを確認できます。
TIP
ServBayでは、ウェブサイトやプロジェクトファイルを /Applications/ServBay/www
ディレクトリ下に配置することを推奨しています。この場所に保管することでサイト管理・設定も容易です。本記事の各サンプルもこのパスを前提に進めます。
Swoole HTTPサーバーを作成してみよう
ここからSwoole HTTPサーバーを構築し、基本的なWebリクエスト処理の手順を解説します。
手順1:プロジェクトディレクトリの作成
ターミナルで以下の手順を実施し、プロジェクト用の新規ディレクトリを作成します。推奨パス /Applications/ServBay/www
を使用しています。
cd /Applications/ServBay/www
mkdir servbay-swoole-http
cd servbay-swoole-http
2
3
手順2:サーバースクリプトの作成
servbay-swoole-http
ディレクトリ内に server.php
というファイルを新規作成し、以下の内容を貼り付けます:
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
// Swoole HTTPサーバーのインスタンスを作成
// すべてのネットワークインターフェース (0.0.0.0) の9501番ポートで待ち受け
$server = new Server("0.0.0.0", 9501);
// 'start'イベントのコールバックを登録
// サーバーの起動成功時に呼び出される
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
// ここでメインプロセスIDや管理プロセスIDなどのログ出力可能
});
// 'request'イベントのコールバックを登録
// 新しいHTTPリクエスト受信時に呼び出される
$server->on("request", function (Request $request, Response $response) {
// レスポンスヘッダーを設定
$response->header("Content-Type", "text/plain");
// リクエストパスやパラメータによるロジック処理
$path = $request->server['request_uri'] ?? '/';
$content = "Hello ServBay!";
if ($path === '/info') {
$content = "Request path: " . $path . "\n";
$content .= "Method: " . $request->server['request_method'] . "\n";
$content .= "Client IP: " . $request->server['remote_addr'] . "\n";
// さらに多くのリクエスト情報は$requestオブジェクト経由で取得可能
}
// レスポンスボディを返してリクエスト処理終了
$response->end($content);
});
// サーバーを起動
$server->start();
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
このスクリプトはSwoole HTTPサーバーを起動し、9501ポートでリクエスト待ち受け。「Hello ServBay!」というテキストを返し、/info
パスへのアクセス時はリクエスト情報を表示します。
手順3:Swooleサーバーの起動
カレントディレクトリが servbay-swoole-http
であることを確認し、Swooleが有効なPHPバージョンでスクリプトを実行します。
php server.php
正常に起動すると、次のようなメッセージが表示されます:
Swoole HTTP server is started at http://0.0.0.0:9501
これでSwoole HTTPサーバーが9501ポートでバックグラウンド動作しています。
手順4:Swooleサーバーへアクセス
ウェブブラウザで以下のアドレスにアクセスしてください。
http://localhost:9501
http://localhost:9501/info
前者は Hello ServBay!
、後者はリクエスト情報がテキストで表示されます。
サーバー停止時は、スクリプト実行中のターミナルウィンドウに戻り Ctrl + C
を押してください。
SwooleでWebSocket通信を扱う
SwooleはWebSocketプロトコルもネイティブ対応し、リアルタイム通信アプリ構築(チャット、ゲームサーバー、データプッシュ等)に最適です。
手順1:WebSocketサーバースクリプトの作成
/Applications/ServBay/www/servbay-swoole-http
(または servbay-swoole-websocket
など新ディレクトリ)に websocket_server.php
を作成し、次の内容を記述します:
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
// Swoole WebSocketサーバーのインスタンス作成
// WebSocketサーバーはHTTPサーバーを継承し、HTTPリクエストにも対応
$server = new Server("0.0.0.0", 9502); // 9502ポートで待ち受け
// 'start'イベント サーバー起動時に呼び出し
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is started at ws://0.0.0.0:9502\n";
});
// 'open'イベント 新しいWebSocket接続成立時に呼び出し
// $requestオブジェクトにクライアント接続情報あり
$server->on("open", function (Server $server, Request $request) {
echo "connection open: {$request->fd}\n";
// クライアントへのウェルカムメッセージ送信可能
$server->push($request->fd, "Welcome to ServBay WebSocket Demo!");
});
// 'message'イベント サーバーがクライアントからWebSocketメッセージ受信時
// $frameオブジェクトにメッセージ内容・クライアントFDあり
$server->on("message", function (Server $server, Frame $frame) {
echo "received message from {$frame->fd}: {$frame->data}\n";
// 全クライアントへのブロードキャストや発信者への返信可能
// 例:発信者へ返信
$server->push($frame->fd, "Hello, you sent: {$frame->data}");
// ブロードキャスト例(全クライアントに送信する場合は接続リスト管理やループ処理)
// foreach ($server->connections as $fd) {
// if ($fd != $frame->fd) { // 自分以外に送信
// $server->push($fd, "User {$frame->fd} says: {$frame->data}");
// }
// }
});
// 'close'イベント クライアント接続切断時に呼び出し
$server->on("close", function ($ser, $fd) {
echo "connection close: {$fd}\n";
});
// サーバーを起動
$server->start();
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
このスクリプトは9502ポートでSwoole WebSocketサーバーを起動し、以下の主要イベントにコールバックを設定しています:start
(起動時)、open
(新規接続)、message
(メッセージ受付)、close
(切断時)。message
イベントでは受信メッセージにテキストを付加して返信します。
手順2:WebSocketサーバーの起動
websocket_server.php
を設置したディレクトリで、Swooleが有効なPHPでスクリプトを実行します。
php websocket_server.php
正常動作時、次のメッセージが表示されます:
Swoole WebSocket server is started at ws://0.0.0.0:9502
これでWebSocketサーバーが9502ポートでバックグラウンド動作しています。
手順3:WebSocketサーバーへの接続テスト
さまざまな方法でこのWebSocketサーバーとの通信テストができます。
方法A: ブラウザの開発者ツール利用
主要なブラウザの開発者ツール(F12)には「ネットワーク」や「コンソール」パネルがあり、WebSocket接続テストが可能です。
任意のウェブページ(例:
about:blank
)を開く開発者ツールを開いて「コンソール」パネルに切り替え
以下のJavaScriptコードで接続開始:
javascriptvar ws = new WebSocket("ws://localhost:9502"); ws.onopen = function(event) { console.log("WebSocket connection opened:", event); ws.send("Hello from Browser!"); // 接続成功時に送信 }; ws.onmessage = function(event) { console.log("Message from server:", event.data); // サーバーからのメッセージ受信 }; ws.onerror = function(event) { console.error("WebSocket error:", event); // エラー発生時 }; ws.onclose = function(event) { console.log("WebSocket connection closed:", event); // 切断時 }; // ws.send("任意メッセージ") で随時メッセージ送信可能 // ws.close() で接続を閉じる
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21実行後、コンソール出力や
websocket_server.php
実行中ターミナルで通信ログが確認できます。
方法B: wscat
コマンドラインツール使用
wscat
はNode.jsベースの便利なコマンドラインWebSocketクライアントです。
wscat
のインストール
Node.jsおよびnpm未インストールなら事前に準備してください。次にnpmでwscat
をグローバルインストール:bashnpm install -g wscat
1WebSocketサーバーに接続
ターミナルで以下を実行:bashwscat -c ws://localhost:9502
1接続に成功すると
>
プロンプトが表示されます。メッセージ送信
>
の後に送信したいメッセージを入力しエンター:bash> Hello ServBay via wscat
1サーバーは返信メッセージを返し、
<
で始まるレスポンスが表示されます:bash< Hello, you sent: Hello ServBay via wscat
1このとき
websocket_server.php
実行中のターミナルにも通信ログが出ます。
wscat
から切断する際は Ctrl + C
を押してください。
注意点
- ポート重複: Swooleサーバー用ポート(例: 9501, 9502)が他のプログラムで使用されていないか確認してください。競合がある場合、Swooleサーバーは起動できません。
- PHPバージョン: スクリプト実行時、ServBayでSwooleが有効化されたPHPバージョンを利用してください。
php -v
コマンドで現在のバージョンを確認できます。ServBayはバージョン切り替え用CLIも提供しています。 - 拡張の有効化: サーバー起動失敗時は、希望のPHPバージョンでSwoole拡張が正しく有効か、ServBayやPHPサービスが再起動されているか再確認しましょう。
- 常駐プロセス管理: Swooleサーバーは常駐型プロセスです。本番運用ならSupervisor, Systemd, pm2などのプロセス管理ツールで監視・自動再起動を行ってください。ServBayのローカル開発環境では、手動での起動・停止が容易です。
まとめ
ServBayを使えば、Swoole拡張の有効化から利用までとても簡単です。従来のHTTPサービスから最新のWebSocketリアルタイム通信アプリまで、本格的な高性能PHPアプリをローカル開発環境で手軽に構築・テストできます。Swooleの強力な機能とServBayの柔軟な開発基盤が合わされば、PHP開発者はより効率的で拡張性の高いアプリケーションを実現できます。ぜひServBayでSwooleを試してみてください!