ServBayでWebmanプロジェクトを作成・実行する方法
Webmanとは?
Webmanは、Workermanベースの高性能PHP非同期Webフレームワークで、高い同時接続数とパフォーマンスを持つWebアプリケーションの構築を目的としています。従来の同期型ブロッキングフレームワークとは異なり、Webmanはイベント駆動・非同期非ブロッキング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による一元管理(ローカルサイト設定/元“ホスト”機能)に便利です。
事前準備
開始前に以下を確認してください:
- ServBayのインストール: macOS上でServBayをインストール済みであること。ServBayはPHP, Composer, MySQL, PostgreSQL, Redis, Memcachedなど本チュートリアルに必要なすべてのパッケージを含むワンストップ開発環境です。
- 必要なパッケージの起動: ServBayコントロールパネルで下記パッケージがインストール・稼働中であることを確認してください。
- 選択したPHPバージョン(推奨:PHP 8.xなど新しいバージョン)
- Composer(ServBay標準搭載)
- MySQL
- PostgreSQL
- Redis
- Memcached
- 選択PHPバージョンで**
memcached
**,redis
,pdo_mysql
, **pdo_pgsql
**などの必須PHPエクステンションが有効化済み。通常ServBayでは主要エクステンションがデフォルトで有効です。詳細はServBayのPHP設定画面で確認できます。
- ターミナル利用: macOSのターミナルアプリに慣れていること。
Webmanのインストール
Composerの確認
ServBayにはComposerが付属しており、ターミナルで直接使用できます。下記コマンドでComposerバージョン確認:
bashcomposer --version
1バージョン情報が表示されればComposerの準備完了です。
ServBayサイトディレクトリへの移動
ターミナルでServBay推奨のウェブサイトルートディレクトリへ移動します:
bashcd /Applications/ServBay/www
1ComposerでWebmanプロジェクトを作成
Composerの
create-project
コマンドを使い、Webmanフレームワークを指定ディレクトリにインストールします。プロジェクト名はservbay-webman-app
とします:bashcomposer create-project workerman/webman servbay-webman-app
1Composerが
servbay-webman-app
ディレクトリにWebmanと主要依存パッケージをダウンロードします。プロジェクトディレクトリに移動
インストールが完了したら新しく作成されたプロジェクトディレクトリへ:
bashcd servbay-webman-app
1必要なコンポーネントのインストール
データベースとキャッシュ機能を例示するため、追加のComposerライブラリが必要です。Webmanでは
illuminate/database
(Laravel由来)、illuminate/redis
などが使われます。-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のデフォルトDBユーザーroot
のパスワードはpassword
です。
ServBay付属のphpMyAdminやpgAdmin(コントロールパネル経由)、またはコマンドラインで、下記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; -- 作成済みDBへの接続 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プロジェクトのコード作成
次に、ルーティング定義・コントローラー作成と、DB・キャッシュ連携ロジックの実装を行います。
ルーティングの設定
プロジェクトルートの
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 Facade 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); // key・value更新 if (!$success) { return response('Memcached keyのセットに失敗しました', 500); } // キャッシュの取得 $value = $memcached->get('servbay_key'); // key更新 // 取得値を返す return response($value ?: 'Memcached keyが存在しないか期限切れです'); // 未取得時の案内追加 } /** * Redisの使用例 * @param Request $request * @return Response */ public function redis(Request $request): Response { // WebmanのRedis Facadeでキャッシュセット Redis::set('servbay_redis_key', 'Hello Redis from ServBay!'); // key・value更新 // WebmanのRedis Facadeでキャッシュ取得 $value = Redis::get('servbay_redis_key'); // key更新 // 取得値を返す return response($value ?: 'Redis keyが見つかりません'); // 未取得時の案内追加 } }
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 Facade class DatabaseController { /** * MySQLデータベースへユーザー追加 * @param Request $request * @return Response */ public function mysqlAdd(Request $request): Response { try { // Db Facadeで'mysql'へ接続しデータ挿入 Db::connection('mysql')->table('users')->insert([ 'name' => 'ServBay Webman MySQL User', // サンプルデータ 'email' => 'mysql_demo@servbay.test', // サンプルメール 'created_at' => date('Y-m-d H:i:s') // 作成日時 ]); return response('MySQLへユーザー追加完了'); // レスポンス内容更新 } catch (\Exception $e) { return response('MySQLへのユーザー追加中エラー: ' . $e->getMessage(), 500); // エラー処理追加 } } /** * MySQLユーザー一覧の取得 * @param Request $request * @return Response */ public function mysqlGet(Request $request): Response { try { // Db Facadeで'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('MySQLユーザー取得エラー: ' . $e->getMessage(), 500); // エラー処理追加 } } /** * PostgreSQLデータベースへユーザー追加 * @param Request $request * @return Response */ public function pgsqlAdd(Request $request): Response { try { // Db Facadeで'pgsql'へ接続しデータ挿入 Db::connection('pgsql')->table('users')->insert([ 'name' => 'ServBay Webman PgSQL User', // サンプルデータ 'email' => 'pgsql_demo@servbay.test', // サンプルメール 'created_at' => date('Y-m-d H:i:s') // 作成日時 ]); return response('PostgreSQLへユーザー追加完了'); // レスポンス内容更新 } catch (\Exception $e) { return response('PostgreSQLへのユーザー追加中エラー: ' . $e->getMessage(), 500); // エラー処理追加 } } /** * PostgreSQLユーザー一覧の取得 * @param Request $request * @return Response */ public function pgsqlGet(Request $request): Response { try { // Db Facadeで'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('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標準ホストは127.0.0.1
、ポートはMySQLが3306
、PostgreSQLが5432
、root
パスワードはpassword
です。php<?php /** * データベース設定 */ return [ // デフォルトDB接続の指定 'default' => 'mysql', // 接続設定一覧 'connections' => [ 'mysql' => [ 'driver' => 'mysql', // ServBay標準MySQLホスト・ポート 'host' => '127.0.0.1', 'port' => 3306, // 作成したDB名 '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, // 作成したDB名 '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重要: 本番環境ではデフォルトパスワードは必ず変更し、コード内に機密情報をハードコーディングしないでください。
Webmanプロジェクトの起動
Webmanプロジェクトは同梱のstart.php
スクリプトでWorkermanプロセスを起動します。Nginx/Apache + PHP-FPMとは異なり、Webmanは常駐型非同期アプリケーションです。
プロジェクトルート(/Applications/ServBay/www/servbay-webman-app
)で下記コマンド実行:
bash
php start.php start
1
このコマンド実行後、Webmanの起動情報が表示され、デフォルトで127.0.0.1:8787
でHTTPリクエストを受け付けます。
- 注意:
php
コマンドはServBay環境のPHPを使います。ServBayが自動的にターミナル環境を整備するので、そのまま利用可能です。 - 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!
が表示されます。http://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に新規レコード追加。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
ディレクトリにcd
しているか確認し、ServBayのPHPがPATHに正しく設定されているか(通常自動設定されます)も確認してください。
- A: ターミナルで
- Q:
localhost:8787
が接続できない?- A:
php start.php start
実行時のターミナル出力にエラーがないか確認。ポート8787
が他プロセスで使用中の場合は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立ち上げからDB・キャッシュ連携まで速やかに環境構築が可能です。Webmanの高パフォーマンスとServBayの利便性によって、非同期PHPアプリ開発を力強くサポートできます。本ガイドがServBayおよびWebman活用による優れたWebアプリ構築に役立つことを願っています。