ServBayでWebmanプロジェクトを作成して実行する
Webmanとは?
WebmanはWorkermanベースの高性能PHP非同期Webフレームワークであり、高並列・高パフォーマンスなWebアプリケーションの構築を目的に設計されています。従来の同期ブロッキング型フレームワークとは異なり、イベント駆動・非同期ノンブロッキングI/Oモデルを採用することで、多数の同時接続を処理する際にも非常に優れたパフォーマンスを発揮します。Webmanはシンプルかつ使いやすいAPIと柔軟な拡張メカニズムを提供し、リアルタイムアプリケーションやAPIサービス、マイクロサービス構築に最適です。
Webmanの主な特徴と利点
- 高性能: Workermanを基盤とし、イベント駆動および非同期ノンブロッキングI/Oを活用、膨大な同時接続に対応し、従来同期型フレームワークを大きく上回るスループットを実現。
- 使いやすさ: 直感的で分かりやすいAPIや豊富な機能を提供し、開発者が素早く習得・開発できる環境を用意。
- 多プロトコル対応: HTTP、WebSocketなど主要なアプリケーション層プロトコルを標準サポートし、様々なサービスの構築が容易。
- 柔軟な拡張性: Composerパッケージやプラグイン、ミドルウェアによる拡張が簡単。
- 低リソース消費: 従来のWebサーバー+PHP-FPM型とは異なり、常駐メモリアプリケーションとしてリソース消費が非常に低い。
- 強力なコミュニティサポート: 活発な開発者コミュニティや豊富なドキュメントが利点。
Webmanは開発者が高性能・高可用性のWebアプリケーションやAPIサービスを素早く構築できるようサポートし、とくに高並列・低レイテンシが求められる場面で力を発揮します。
ServBayを使ってシンプルなWebmanプロジェクトを作成・実行する
本ガイドでは、ServBayローカル開発環境でWebmanを用いたシンプルなWebプロジェクトの構築・実行方法を詳しく解説します。Webmanのインストール、ルーティングやコントローラーの基本コード記述、そしてServBayが提供するデータベース(MySQL、PostgreSQL)・キャッシュサービス(Redis、Memcached)の連携方法までを実演します。
TIP
ServBayでは全てのローカルウェブサイトプロジェクトを/Applications/ServBay/www
ディレクトリに配置することを推奨しています。これにより、ローカルサイト(旧称“ホスト”)の一元管理や設定が簡単になります。
事前準備
開始前に以下の準備が整っていることを確認してください。
- ServBayのインストール: macOS上にServBayが正しくインストールされていること。ServBayはPHP、Composer、MySQL、PostgreSQL、Redis、Memcachedなど本ガイドで必要な全てのソフトウェアを一括で提供します。
- 必要なパッケージの有効化: ServBayコントロールパネルで下記パッケージがインストール・起動済みであることを確認してください。
- 利用するPHPバージョン(推奨は新しいもの、例:PHP8.x)
- Composer(ServBayに内蔵)
- MySQL
- PostgreSQL
- Redis
- Memcached
- 選択したPHPバージョンで
memcached
,redis
,pdo_mysql
,pdo_pgsql
など必要なPHP拡張モジュールが有効になっていること。ServBayではこれらの主要拡張がデフォルトで有効になっています。PHP設定画面で確認できます。
- ターミナル操作: macOSのターミナルアプリに慣れていること。
Webmanのインストール
Composerの動作確認
ServBayにはComposerが標準搭載されており、ターミナルですぐ利用できます。ターミナルで下記コマンドを実行し確認してください。
bashcomposer --version
1Composerバージョン情報が表示されれば準備OKです。
ServBayウェブサイトディレクトリへ移動
ターミナルで、推奨されるWebサイトのルートディレクトリに移動します。
bashcd /Applications/ServBay/www
1ComposerでWebmanプロジェクトを作成
Composerの
create-project
コマンドを使ってWebmanフレームワークをインストールします。サンプルではプロジェクト名をservbay-webman-app
とします。bashcomposer create-project workerman/webman servbay-webman-app
1PackagistからWebman本体および依存モジュールが
servbay-webman-app
ディレクトリ内にダウンロードされます。プロジェクトディレクトリに移動
インストールが完了したらディレクトリを移動します。
bashcd servbay-webman-app
1必要なパッケージの追加インストール
データベースやキャッシュ利用のため、追加でComposerパッケージをインストールします。Webmanでは通常
illuminate/database
やilluminate/redis
(いずれもLaravelコンポーネント)などを利用します。-W
(--with-dependencies
)オプションは依存関係の解決に使用します。bashcomposer require -W illuminate/database illuminate/redis illuminate/pagination illuminate/events symfony/var-dumper
1このコマンドでORMやRedisクライアント、ページネーション、イベントディスパッチ、デバッグ用VarDumperがインストールされます。
データベースとテーブルの作成
サンプルコードが正確に動作するよう、ServBayのMySQLとPostgreSQLデータベースで必要なデータベースとusers
テーブルを作成します。ServBayのデフォルトroot
ユーザーのパスワードはpassword
です。
ServBayのデータベース管理ツール(phpMyAdminやpgAdmin:ServBayコントロールパネル経由)またはターミナルを用いて、以下のSQLを実行してください。
webman_app
データベースの作成- MySQL:sql
CREATE DATABASE IF NOT EXISTS webman_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
1 - PostgreSQL:sql
CREATE DATABASE webman_app;
1
- MySQL:
webman_app
データベースにusers
テーブルを作成- MySQL:sql
USE webman_app; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
1
2
3
4
5
6
7 - PostgreSQL:sql
\c webman_app; -- 新規作成したデータベースへ接続 CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
1
2
3
4
5
6
7
- MySQL:
Webプロジェクトコードの実装
次に、ルーティング定義・コントローラ作成・データベースやキャッシュとの連携ロジックを実装しましょう。
ルート設定
プロジェクトディレクトリ直下の
config/route.php
を編集し、以下のサンプルルートを追加します。php<?php use Webman\Route; use app\controller\IndexController; use app\controller\CacheController; use app\controller\DatabaseController; // ルートパスをIndexControllerのindexメソッドへマッピング Route::any('/', [IndexController::class, 'index']); // キャッシュ関連ルート Route::any('/memcached', [CacheController::class, 'memcached']); Route::any('/redis', [CacheController::class, 'redis']); // データベース関連ルート Route::any('/mysql-add', [DatabaseController::class, 'mysqlAdd']); Route::any('/mysql', [DatabaseController::class, 'mysqlGet']); Route::any('/pgsql-add', [DatabaseController::class, 'pgsqlAdd']); Route::any('/pgsql', [DatabaseController::class, 'pgsqlGet']); // ここに追加のルートを記述できます...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21コントローラーファイルの作成
app/controller
ディレクトリ配下にIndexController.php
、CacheController.php
、DatabaseController.php
をそれぞれ作成し、以下の内容を記述します。app/controller/IndexController.php
: (ルートパスリクエストを処理)php<?php namespace app\controller; use support\Request; use support\Response; // Responseクラスをインポート class IndexController { /** * ルートパスリクエストの処理例 * @param Request $request 現在のリクエストオブジェクト * @return Response Responseオブジェクトを返却 */ public function index(Request $request): Response // 戻り型を明示 { // シンプルなテキストレスポンスを返却 return response('Hello ServBay & Webman!'); // ウェルカムメッセージ更新 } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20app/controller/CacheController.php
: (MemcachedおよびRedis利用デモ用)php<?php namespace app\controller; use support\Request; use support\Response; use Memcached; // Memcachedクラスをインポート use support\Redis; // WebmanのRedisファサードをインポート class CacheController { /** * Memcached利用例 * @param Request $request * @return Response */ public function memcached(Request $request): Response { // Memcachedサーバーへ接続(ServBayは127.0.0.1:11211がデフォルト) $memcached = new Memcached(); $memcached->addServer('127.0.0.1', 11211); // キャッシュセット、60秒有効 $success = $memcached->set('servbay_key', 'Hello Memcached from ServBay!', 60); // キーと値を更新 if (!$success) { return response('Failed to set Memcached key', 500); } // キャッシュ取得 $value = $memcached->get('servbay_key'); // キーを更新 // 取得値を返却 return response($value ?: 'Memcached key not found or expired'); // 見つからない場合のメッセージ追加 } /** * Redis利用例 * @param Request $request * @return Response */ public function redis(Request $request): Response { // WebmanのRedisファサードでキャッシュセット Redis::set('servbay_redis_key', 'Hello Redis from ServBay!'); // キーと値を更新 // 取得 $value = Redis::get('servbay_redis_key'); // キーを更新 // 結果返却 return response($value ?: 'Redis key not found'); // 見つからない場合のメッセージ追加 } }
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
50
51
52app/controller/DatabaseController.php
: (MySQL/PostgreSQL操作デモ用)php<?php namespace app\controller; use support\Request; use support\Response; use support\Db; // WebmanのDbファサードをインポート class DatabaseController { /** * MySQLにユーザーを追加 * @param Request $request * @return Response */ public function mysqlAdd(Request $request): Response { try { // Dbファサードで'mysql'に接続し、データ挿入 Db::connection('mysql')->table('users')->insert([ 'name' => 'ServBay Webman MySQL User', // サンプルデータを更新 'email' => '[email protected]', // メールサンプル 'created_at' => date('Y-m-d H:i:s') // created_atを追加 ]); return response('User added to MySQL'); // レスポンス更新 } catch (\Exception $e) { return response('Error adding user to MySQL: ' . $e->getMessage(), 500); // エラーハンドリング追加 } } /** * MySQLユーザーリスト取得 * @param Request $request * @return Response */ public function mysqlGet(Request $request): Response { try { // Dbファサードで'mysql'に接続し全ユーザー取得 $users = Db::connection('mysql')->table('users')->get(); // JSON形式で返却 return response(json_encode($users), 200, ['Content-Type' => 'application/json']); // Content-Typeを明示 } catch (\Exception $e) { return response('Error getting users from MySQL: ' . $e->getMessage(), 500); // エラーハンドリング追加 } } /** * PostgreSQLにユーザーを追加 * @param Request $request * @return Response */ public function pgsqlAdd(Request $request): Response { try { // Dbファサードで'pgsql'に接続しデータ挿入 Db::connection('pgsql')->table('users')->insert([ 'name' => 'ServBay Webman PgSQL User', // サンプルデータを更新 'email' => '[email protected]', // メールサンプル 'created_at' => date('Y-m-d H:i:s') // created_atを追加 ]); return response('User added to PostgreSQL'); // レスポンス更新 } catch (\Exception $e) { return response('Error adding user to PostgreSQL: ' . $e->getMessage(), 500); // エラーハンドリング追加 } } /** * PostgreSQLユーザーリスト取得 * @param Request $request * @return Response */ public function pgsqlGet(Request $request): Response { try { // Dbファサードで'pgsql'に接続し全ユーザー取得 $users = Db::connection('pgsql')->table('users')->get(); // JSON形式で返却 return response(json_encode($users), 200, ['Content-Type' => 'application/json']); // Content-Type明示 } catch (\Exception $e) { return response('Error getting users from PostgreSQL: ' . $e->getMessage(), 500); // エラーハンドリング追加 } } }
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
データベース接続の設定
プロジェクト直下の
config/database.php
を編集し、MySQL/PostgreSQLへの接続情報を記入します。ServBayのデフォルトDBホストは127.0.0.1
、ポートは3306
(MySQL)、5432
(PostgreSQL)、root
のパスワードはpassword
です。php<?php /** * データベース設定 */ return [ // 利用するデフォルト接続 'default' => 'mysql', // データベース接続設定リスト 'connections' => [ 'mysql' => [ 'driver' => 'mysql', // ServBayデフォルトMySQLホスト・ポート 'host' => '127.0.0.1', 'port' => 3306, // 作成済みデータベース名 'database' => 'webman_app', // ServBayデフォルトMySQLユーザー名 'username' => 'root', // ServBayデフォルトMySQLパスワード 'password' => 'password', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], 'pgsql' => [ 'driver' => 'pgsql', // ServBayデフォルトPostgreSQLホスト・ポート 'host' => '127.0.0.1', 'port' => 5432, // 作成済みデータベース名 'database' => 'webman_app', // ServBayデフォルトPostgreSQLユーザー名 'username' => 'root', // ServBayデフォルトPostgreSQLパスワード 'password' => 'password', 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', 'sslmode' => 'prefer', // または require, verify-ca, verify-full ], // ここに他のDB接続設定を追加可能... ], ];
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重要: 本番環境では必ずデフォルトDBパスワードを変更し、ソースコード内に機密情報をハードコーディングしないようご注意ください。
Webmanプロジェクトの起動
Webmanは付属のstart.php
スクリプト経由でWorkermanプロセスを起動します。Nginx/Apache+PHP-FPMとは異なり、Webmanは常駐メモリ型の非同期アプリケーションです。
プロジェクトルート(/Applications/ServBay/www/servbay-webman-app
)で下記コマンドを実行し、Webmanを起動します。
php start.php start
コマンド実行後、Webmanの起動情報が表示され、デフォルトで127.0.0.1:8787
でHTTPリクエストを受け付けます。
- 注意:
php
コマンドはServBay環境のPHP実行ファイルを指します。ServBayは自動的にターミナル環境を構成し、インストールされたPHPをすぐに利用できるようにします。 - Webmanをバックグラウンドで実行する場合は
-d
オプション:php start.php start -d
- Webmanサービスを停止する場合:
php start.php stop
- 再起動する場合:
php start.php restart
- スムーズリロード(現在のリクエストは中断せず):
php start.php reload
プロジェクトのテスト
Webmanが正しく起動し127.0.0.1:8787
をリッスンし始めたら、ブラウザで以下のURLを開いて各機能をテストできます。
http://localhost:8787/
:Hello ServBay & Webman!
と表示されればOKhttp://localhost:8787/memcached
:Hello Memcached from ServBay!
と表示されれば、WebmanからServBayのMemcachedへ正常に接続・操作できています。http://localhost:8787/redis
:Hello Redis from ServBay!
と表示されれば、WebmanからServBayのRedisへ正常に接続できています。http://localhost:8787/mysql-add
:User added to MySQL
と表示されれば、MySQLのusers
テーブルにレコードが追加されました。http://localhost:8787/mysql
:MySQLのusers
テーブル内のユーザーリストがJSON形式で出力されます。http://localhost:8787/pgsql-add
:User added to PostgreSQL
と表示されれば、PostgreSQLのusers
テーブルにレコードが追加されました。http://localhost:8787/pgsql
:PostgreSQLのusers
テーブル内のユーザーリストがJSON形式で出力されます。
URLにアクセスして問題が発生した際は、ターミナルでWebmanの出力にエラーがないか確認し、ServBayでMySQL, PostgreSQL, Redis, Memcachedが稼働中か、PHP拡張が有効かチェックしてください。
よくある質問 (FAQ)
- Q:
php start.php start
が見つからない?- A:
servbay-webman-app
ディレクトリに正しく移動しているか確認してください。また、ServBayのPHPがPATHへ正しく設定されているか(通常は自動構成済み)。
- A:
- Q:
localhost:8787
にアクセスできない?- A: ターミナルで
php start.php start
の出力にエラーがないか確認。ポート8787
が他のプロセスで利用されていないかチェックしてください。ポート競合時はWebmanの設定(例:config/server.php
)を変更できます。
- A: ターミナルで
- Q: データベース接続で失敗する?
- A: ServBayのMySQL/PostgreSQLが稼働中か確認。
config/database.php
の接続情報(ホスト・ポート・DB名・ユーザー名・パスワード)がServBayの設定(デフォルトはユーザーroot
/パスワードpassword
)と一致するか検証してください。webman_app
とusers
テーブルを作成済みかもご確認を。
- A: ServBayのMySQL/PostgreSQLが稼働中か確認。
- Q: MemcachedやRedisへの接続が失敗する?
- A: ServBayのMemcached/Redisが起動中か確認し、
app/controller/CacheController.php
で指定するアドレス・ポート(デフォルト127.0.0.1:11211
と127.0.0.1:6379
)と一致しているかを確かめてください。利用PHPバージョンでmemcached
やredis
拡張が有効かどうかも確認しましょう。
- A: ServBayのMemcached/Redisが起動中か確認し、
まとめ
以上で、ServBayローカル開発環境にてWebmanプロジェクトを作成・設定・実行する基本的な手順を完了できました。ServBayが提供するオールインワン環境により、Webmanの開発環境構築とデータベース・キャッシュ連携が迅速かつ容易に行えます。Webmanの“高性能”とServBayの“利便性”を組み合わせることで、非同期PHPアプリ開発の強力な基盤となります。本ガイドがServBayとWebmanを活用したウェブ開発における第一歩となれば幸いです。