高性能な PHP アプリケーションを Swoole で作成する
Swoole とは
Swoole は PHP 用の高性能ネットワーク通信フレームワークで、非同期、マルチスレッド、コルーチンなどの機能を提供し、PHP が Node.js のように高並列タスクを処理できるようにします。TCP、UDP、UnixSocket、HTTP、WebSocket などの複数のプロトコルをサポートし、高性能な Web サーバー、マイクロサービスアーキテクチャ、リアルタイム通信システムなどの構築に適しています。
Swoole の主な特性と利点
- 高性能:Swoole は C 言語で書かれており、非常に高い性能を持ち、非同期 IO やコルーチンをサポートしており、高並列リクエストを処理できます。
- 豊富な機能:複数のネットワークプロトコル、タイマー、プロセスマネジメント、メモリマネジメントなどをサポートし、さまざまな開発ニーズに対応できます。
- 使いやすさ:簡単に使える API と豊富なドキュメントが提供されており、開発者が迅速に使い始めることができます。
- 拡張性の高さ:カスタム拡張とプラグインをサポートしており、ニーズに応じた柔軟なカスタマイズが可能です。
Swoole は高性能な Web アプリケーションやリアルタイム通信システムの構築に最適で、小規模なアプリケーションから大規模なエンタープライズシステムまで、さまざまなプロジェクトに利用できます。
Swoole のインストール
この記事では、ServBay 環境で Swoole をインストールして使用する方法を紹介します。
TIP
ServBay は、サイトを管理しやすいように /Applications/ServBay/www
ディレクトリに配置することを推奨します。
ステップ 1:Swoole 拡張のインストール
Swoole 拡張の有効化
ServBay には Swoole 拡張が組み込まれており、ユーザーは PHP を再起動した後に有効化する必要があります。Swoole モジュールを有効にする手順は 如何启用ServBay自带的Swoole模块 で確認できます。
ステップ 2:プロジェクトディレクトリの作成
プロジェクトディレクトリを作成し、移動します:
cd /Applications/ServBay/www
mkdir servbay-swoole-app
cd servbay-swoole-app
2
3
ステップ 3:Swoole サーバースクリプトの作成
プロジェクトディレクトリ内に server.php
ファイルを作成し、簡単な Swoole HTTP サーバーを記述します:
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
$server = new Server("0.0.0.0", 9501);
$server->on("start", function (Server $server) {
echo "Swoole HTTP サーバーが http://0.0.0.0:9501 に開始しました\n";
});
$server->on("request", function (Request $request, Response $response) {
$response->header("Content-Type", "text/plain");
$response->end("こんにちは、ServBay!");
});
$server->start();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ステップ 4:Swoole サーバーの実行
ターミナルで以下のコマンドを実行して Swoole サーバーを開始します:
php server.php
以下の出力が表示されます:
Swoole HTTP サーバーが http://0.0.0.0:9501 に開始しました
ステップ 5:Swoole サーバーへのアクセス
ブラウザを開いて http://localhost:9501
にアクセスすると、こんにちは、ServBay!
というメッセージが表示されます。
Swoole を使用して Web アプリケーションを作成する
このセクションでは、Swoole を使用してシンプルな Web アプリケーションを作成する方法を示します。
コントローラーとルーティングの作成
プロジェクトディレクトリに app
ディレクトリを作成し、その中に controllers
と routes
ディレクトリを作成します:
mkdir -p app/controllers
mkdir -p app/routes
2
app/controllers
ディレクトリに HomeController.php
ファイルを作成します:
<?php
namespace App\Controllers;
class HomeController
{
public function index()
{
return "ServBay へようこそ!";
}
public function hello($name)
{
return "こんにちは、$name!";
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
app/routes
ディレクトリに web.php
ファイルを作成します:
<?php
use App\Controllers\HomeController;
return [
'GET /' => [HomeController::class, 'index'],
'GET /hello/{name}' => [HomeController::class, 'hello'],
];
2
3
4
5
6
7
8
Swoole サーバースクリプトの更新
server.php
ファイルを更新し、ルーティング解析とコントローラー呼び出しロジックを追加します:
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
use FastRoute\RouteCollector;
use function FastRoute\simpleDispatcher;
require 'vendor/autoload.php';
$server = new Server("0.0.0.0", 9501);
$routes = require __DIR__ . '/app/routes/web.php';
$dispatcher = simpleDispatcher(function (RouteCollector $r) use ($routes) {
foreach ($routes as $route => $handler) {
list($method, $path) = explode(' ', $route);
$r->addRoute($method, $path, $handler);
}
});
$server->on("start", function (Server $server) {
echo "Swoole HTTP サーバーが http://0.0.0.0:9501 に開始しました\n";
});
$server->on("request", function (Request $request, Response $response) use ($dispatcher) {
$routeInfo = $dispatcher->dispatch($request->server['request_method'], $request->server['request_uri']);
switch ($routeInfo[0]) {
case \FastRoute\Dispatcher::NOT_FOUND:
$response->status(404);
$response->end('404 Not Found');
break;
case \FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
$response->status(405);
$response->end('405 Method Not Allowed');
break;
case \FastRoute\Dispatcher::FOUND:
$handler = $routeInfo[1];
$vars = $routeInfo[2];
list($class, $method) = $handler;
$response->header("Content-Type", "text/plain");
$response->end(call_user_func_array([new $class, $method], $vars));
break;
}
});
$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
47
48
FastRoute のインストール
FastRoute ルーティングライブラリをインストールするために、プロジェクトのルートディレクトリで以下のコマンドを実行します:
composer require nikic/fast-route
Swoole サーバーの実行
ターミナルで以下のコマンドを実行して Swoole サーバーを開始します:
php server.php
Web アプリケーションへのアクセス
ブラウザを開いて以下の URL にアクセスします:
http://localhost:9501/
:ServBay へようこそ!
というメッセージが表示されます。http://localhost:9501/hello/ServBay
:こんにちは、ServBay!
というメッセージが表示されます。
Swoole を使用して WebSocket 接続を処理する
Swoole は WebSocket プロトコルもサポートしており、リアルタイム通信アプリケーションの構築に利用できます。ここでは、Swoole を使用して WebSocket 接続を処理する方法を紹介します。
WebSocket サーバースクリプトの作成
プロジェクトディレクトリに websocket_server.php
ファイルを作成し、簡単な WebSocket サーバーを記述します:
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
$server = new Server("0.0.0.0", 9502);
$server->on("start", function (Server $server) {
echo "Swoole WebSocket サーバーが ws://0.0.0.0:9502 に開始しました\n";
});
$server->on("open", function (Server $server, Request $request) {
echo "接続が開かれました: {$request->fd}\n";
});
$server->on("message", function (Server $server, Frame $frame) {
echo "メッセージを受信しました: {$frame->data}\n";
$server->push($frame->fd, "こんにちは、{$frame->data}");
});
$server->on("close", function ($ser, $fd) {
echo "接続が閉じられました: {$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
WebSocket サーバーの実行
ターミナルで以下のコマンドを実行して WebSocket サーバーを開始します:
php websocket_server.php
以下の出力が表示されます:
Swoole WebSocket サーバーが ws://0.0.0.0:9502 に開始しました
WebSocket サーバーへの接続
ブラウザの WebSocket クライアントや他の WebSocket クライアントツール(例えば wscat
)を使用して WebSocket サーバーに接続できます。
wscat
を使用して接続
wscat
をインストールします:bashnpm install -g wscat
1WebSocket サーバーに接続します:
bashwscat -c ws://localhost:9502
1メッセージを送信します:
bash> こんにちは、ServBay
1
サーバーからの返答メッセージが表示されます:
< こんにちは、こんにちは、ServBay
以上の手順で、Swoole プロジェクトを作成し、Swoole の機能を使用して HTTP リクエストや WebSocket 接続を処理する方法を学びました。Swoole の高性能と豊富な機能は、高並列アプリケーションの構築に最適です。