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拡張を簡単に管理・利用できるよう設計されています。Swooleはモダンな高性能PHP開発の必須拡張として、ServBayにプリインストール済みです。ごく簡単な手順で有効化可能です。
前提条件:
- ServBayがインストール・起動済みであること。
- ServBay内で少なくとも1つ以上のPHPバージョンがインストールされていること。
有効化手順:
- ServBayアプリの画面を開く。
- 「パッケージ(Packages)」またはPHPバージョン管理画面に移動。 (ServBayのバージョンにより名称が若干異なる場合あり。主画面または設定項目に通常存在します)
- Swooleを有効化したいPHPバージョンを選択。
- Swoole拡張の項目を見つけ、「有効化」にチェック。 ServBayでは、利用可能な拡張がリストやスイッチ形式で表示されます。
- 変更を保存し、指示に従ってServBayまたはPHPサービスを再起動。 ServBay側で自動的にPHP環境が設定され、Swoole拡張がロードされます。
以上で設定完了です。選択したPHPバージョンでSwooleが利用可能になりました。コマンドラインで php -m
を実行し、swoole
拡張がロード一覧に表示されているかを確認してください。
TIP
ServBayでは、サイトやプロジェクトファイルの推奨保存先として次のディレクトリを提案しています。サイト管理や設定上もこのパスが便利です。
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
本記事内のサンプルでは、上記の推奨パスを使用しています。
Swooleを使った簡単なHTTPサーバーの構築
次に、基本的なSwoole HTTPサーバーを作成し、Webリクエストの処理例を実演します。
ステップ1:プロジェクトディレクトリ作成
ターミナルを開き、新たなプロジェクト用ディレクトリを作成して移動します。ServBayの推奨パスを使います。
macOS:
bash
cd /Applications/ServBay/www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
Windows:
cmd
cd C:\ServBay\www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
ステップ2:サーバースクリプト作成
servbay-swoole-http
ディレクトリで server.php
というファイルを新規作成し、以下の内容を記述します。
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();
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
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
であることを確認し、ServBayでSwoole有効化済みPHPを使ってスクリプトを実行します。
bash
php server.php
1
正常に起動すると、ターミナルに以下の表示が出ます。
bash
Swoole HTTP server is started at http://0.0.0.0:9501
1
Swoole HTTPサーバーがバックグラウンドで9501ポートを監視して稼働中です。
ステップ4:Swooleサーバーへのアクセス
Webブラウザで次のURLにアクセスします。
http://localhost:9501
http://localhost:9501/info
それぞれ、Hello ServBay!
やリクエスト情報を含むテキストが表示されます。
サーバー停止時は、スクリプト実行中のターミナルで Ctrl + C
を押してください。
SwooleでWebSocket接続を処理する
SwooleはWebSocketプロトコルをネイティブサポートしており、チャット・ゲームサーバー・リアルタイムデータ配信等、即時双方向通信アプリの構築に最適です。
ステップ1:WebSocketサーバースクリプト作成
プロジェクトディレクトリ(例: servbay-swoole-http
、または servbay-swoole-websocket
を新規作成)で websocket_server.php
ファイルを作り、下記内容を記述します。
ディレクトリパス例:
- macOS:
/Applications/ServBay/www/servbay-swoole-http
- Windows:
C:\ServBay\www\servbay-swoole-http
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はクライアント接続情報を保持。$request->fdはクライアントファイル記述子
$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にメッセージデータ($frame->data)や送信元FD($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();
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
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
このスクリプトは、9502ポートでSwoole WebSocketサーバーを起動します。start
(サーバー開始)、open
(新規接続)、message
(メッセージ受信)、close
(接続終了)各イベントにコールバックを定義し、 message
では送信内容に前置詞をつけて送り返します。
ステップ2:WebSocketサーバーの起動
ファイル保存先ディレクトリに移動し、ServBayのSwoole有効PHPで起動します。
bash
php websocket_server.php
1
正常起動の場合、ターミナルに次のメッセージが表示されます。
bash
Swoole WebSocket server is started at ws://0.0.0.0:9502
1
バックグラウンドで9502ポート上で待機中です。
ステップ3:WebSocketサーバーへ接続
複数の方法でテスト接続できます。
方法A: ブラウザ開発者ツール利用
多くのモダンブラウザ(F12で起動)の「ネットワーク」や「コンソール」パネルでWebSocket接続が試せます。
適当なページ(例:
about:blank
)を開く。開発者ツールの「Console」タブに切り替え。
下記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 CLIクライアントです。
wscat
のインストール: Node.js/npm未導入の場合は事前インストール後、npmでグローバルインストール。bashnpm install -g wscat
1WebSocketサーバーへの接続: ターミナルで下記コマンドを実行
bashwscat -c ws://localhost:9502
1接続成功で
>
プロンプト表示。メッセージ送信: プロンプトにメッセージ入力・Enter
bash> Hello ServBay via wscat
1サーバー応答が
<
で表示bash< Hello, you sent: Hello ServBay via wscat
1同時に
websocket_server.php
実行中ターミナルにもログが出ます。
接続を切るには Ctrl + C
を押してください。
注意事項
- ポート競合: Swooleサーバーが監視するポート(例: 9501, 9502)が他プログラムで使用中の場合は、サーバーが起動できません。起動前にポートの利用状況を確認しましょう。
- PHPバージョン: スクリプト実行時は、必ずServBay内でSwoole有効化済みのPHPバージョンを利用してください。
php -v
でバージョン確認可能。ServBayにはバージョン切り替え用のCLIツールも用意されています。 - 拡張ステータス: サーバー起動失敗時は、Swoole拡張が対象PHPバージョンで正しく有効化されているか、ServBayやPHPサービスの再起動が反映されているか再確認してください。
- 常駐プロセス管理: Swooleサーバーは常駐メモリプロセスです。商用環境ではSupervisorやSystemd、pm2等プロセスマネージャでの自動再起動・監視も必須になります。ServBayローカル開発環境では端末から手動起動で十分便利です。
まとめ
ServBayでは、Swoole拡張の有効化・利用が非常に簡単です。本格的な高性能PHPアプリのローカル開発・テストが、HTTPやWebSocketといった最新リアルタイム通信機能まで柔軟に行えます。Swooleの圧倒的パフォーマンスとServBayの快適な開発環境で、PHP開発者に新たな可能性が広がります。今すぐServBayでSwooleのパワーを体験してみましょう!