ServBayでZend Framework(Laminas)プロジェクトを作成・実行する
概要
Zend Framework(現:Laminas Projectの一部)は、モダンなWebアプリケーションやサービスを構築するための、高品質かつオブジェクト指向なコンポーネント群を備えた、強力なオープンソースPHPフレームワークです。柔軟性・モジュール設計・高性能で知られ、小規模なWebサイトから大規模なエンタープライズ級アプリケーションまで最適な選択肢です。
ServBayはmacOS向けに設計されたローカルWeb開発環境で、PHPや各種Webサーバー(Caddy、Nginxなど)、データベース(MySQL、PostgreSQL、MongoDBなど)、キャッシュサービス(Redis、Memcached)、その他多様な開発ツールを統合しています。ServBayを利用することで、これらのソフトウェアを簡単に管理でき、さまざまなPHPフレームワークプロジェクトをローカルで素早く構築・実行できます。
このドキュメントでは、ServBay環境下でZend Framework(Laminas)プロジェクトの作成〜動作確認、そしてServBayが提供するデータベース・キャッシュサービスへの統合例を解説します。
前提条件
作業を始める前に、以下の準備を済ませてください。
- ServBayのインストール: macOSにServBayを正しくインストール・起動していること。まだの場合はServBay公式サイトからダウンロード&インストールガイドをご確認ください。
- 必要なソフトウェアパッケージ: ServBayで必要なパッケージ(以下)がインストールされ、動作していること。
- PHP(8.x以降のバージョン推奨。Zend Framework/Laminasの新しいバージョンではより高いPHPバージョンが必要な場合があります)
- Webサーバー(CaddyまたはNginx)
- Composer(ServBayに同梱)
- 使用予定のデータベースサービス(例:MySQL、PostgreSQL)およびキャッシュサービス(例:Memcached、Redis)。ServBayコントロールパネルでこれらのサービスを簡単に起動できます。
Zend Frameworkプロジェクトの新規作成
ServBayでは、Webサイトプロジェクトを /Applications/ServBay/www
ディレクトリ以下にまとめることを推奨しています。これにより、ServBay側でWebサイトの自動管理・設定が容易になります。
Webサイトルートディレクトリへ移動
ターミナルを開き、ServBay推奨のWebサイトルートディレクトリへ移動します。
bashcd /Applications/ServBay/www
1Composerでプロジェクト作成
ServBayにはComposerがプリインストールされています。Composerの
create-project
コマンドを使い、新規Zend Framework(Laminas skeleton application)プロジェクトを作成しましょう。ここではservbay-zend-app
というサブディレクトリにプロジェクトを作成します。bashcomposer create-project laminas/laminas-skeleton-application servbay-zend-app
1これで
servbay-zend-app
ディレクトリに Zend Framework(Laminas)アプリのひな形と必要な依存パッケージ一式がインストールされます。プロジェクトディレクトリへ移動
作成したプロジェクトディレクトリへ移動します。
bashcd servbay-zend-app
1
Webサーバーの設定
Zend Frameworkプロジェクトをブラウザから開くには、ServBayでWebサイト設定を追加します。
- ServBayコントロールパネルを開く: ServBayアプリケーションを起動します。
- Webサイト設定: コントロールパネル内の Webサイト(Websites) タブを選択します。
- 新規Webサイト追加: 左下の
+
ボタンから新しいWebサイトを追加します。 - Webサイト情報を入力:
- 名前(Name): サイトが判別しやすい名前(例:
My Zend Dev Site
) - ドメイン(Domain): ブラウザでアクセスする際の任意のドメイン名を設定します。実在ドメインと競合しない
.local
や.test
を推奨(例:servbay-zend-test.local
)。ServBayがローカルDNS解決を自動設定します。 - Webサイトタイプ(Website Type):
PHP
を選択。 - PHPバージョン(PHP Version): 使用したいPHPバージョン(例:
8.3
)。インストール済&稼働中であることを確認してください。 - ドキュメントルート(Document Root): Webサーバーの公開ディレクトリ。Zend Frameworkの場合、エントリーポイント
index.php
はプロジェクト内のpublic
ディレクトリにあります。よって、ドキュメントルートは/Applications/ServBay/www/servbay-zend-app/public
に指定します。
- 名前(Name): サイトが判別しやすい名前(例:
- 保存・再起動: 保存(Save) ボタンをクリック。ServBayが「設定を反映しますか?」と尋ねるので、OKを押すとWebサーバー設定が再読込され、新しいWebサイトが有効化されます。
詳細な設定手順はServBayドキュメントの最初のWebサイト追加セクションもご参照ください。
シンプルな "Hello ServBay!" の例
プロジェクトのルートURL(/
)にアクセスしたとき「Hello ServBay!」を表示するよう、プロジェクトのコードを修正してみましょう。
ルーティングとコントローラーの設定(module.config.php)
module/Application/config/module.config.php
を開き、ルーティング&コントローラー設定を下記のように追加・修正します。php<?php declare(strict_types=1); namespace Application; use Laminas\Router\Http\Literal; use Laminas\Router\Http\Segment; use Laminas\ServiceManager\Factory\InvokableFactory; return [ 'router' => [ 'routes' => [ 'home' => [ 'type' => Literal::class, 'options' => [ 'route' => '/', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'index', ], ], ], // ... 他のルート設定 ], ], 'controllers' => [ 'factories' => [ Controller\IndexController::class => InvokableFactory::class, ], ], 'view_manager' => [ 'display_not_found_reason' => true, 'display_exceptions' => true, 'doctype' => 'HTML5', 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => [ 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ], 'template_path_stack' => [ __DIR__ . '/../view', ], ], // ... その他設定 ];
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注意: 上記スニペットは
module.config.php
の一部です。既存の設定配列へ適切に統合し、「home
ルート」およびController\IndexController::class
のファクトリが存在していることを確認してください。コントローラーの作成・編集(IndexController.php)
module/Application/src/Controller/IndexController.php
を作成または編集し、indexAction
メソッドでViewModel経由でメッセージを返却するようにします。php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; class IndexController extends AbstractActionController { /** * デフォルトアクション:ウェルカムページを表示 */ public function indexAction() { // ViewModelを返し、'message'変数をビューへ渡す return new ViewModel([ 'message' => 'Hello ServBay!', ]); } // ... その他のアクションメソッド }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24ビュー作成・編集(index.phtml)
module/Application/view/application/index/index.phtml
を作成し、コントローラーから渡されたmessage
変数を表示します。php<h1><?php echo $this->message; ?></h1>
1Zend Framework(Laminas)のビュー・ヘルパー
$this->message
を使ってデータを取得しています。
Webサイトへアクセス
Webブラウザで、ServBayで設定したドメイン(例:https://servbay-zend-test.local
)へアクセスしてください。
設定が正しければ、「Hello ServBay!」と表示され、Zend FrameworkプロジェクトがServBay上で正常稼働していることを確認できます。
データベース・キャッシュ連携のサンプル
ServBayは多様なデータベースやキャッシュサービスをサポートしています。ここではZend FrameworkプロジェクトでMemcached、Redis、MySQL、PostgreSQLを利用するサンプル例を解説します。
ご注意: これらのデータベース・キャッシュ連携のサンプルは個別デモンストレーションです。実際のアプリケーションでは、要件に応じて適切な1つまたは複数のサービスを選択し、DIなどでコネクション管理します。また、各サービス(MySQL/PostgreSQL/Memcached/Redis)はServBayでサービスを起動しておく必要があります。
データベース操作例 - テーブル作成
まずLaminas DBコンポーネントを使い、データベースとやりとり・テーブル作成のサンプルです。ここではLaminas Migrationまでは使わず、手動で簡単なテーブルを作る流れを示します。
Laminas DBパッケージのインストール
プロジェクトルートで以下のコマンドを実行して、Laminas DBコンポーネントを導入します。
bashcomposer require laminas/laminas-db
1データベース手動作成
データベースのサンプル操作前に、ServBayで該当データベース(例:
servbay_zend_app
)を手動で作成してください。ServBayコントロールパネルからphpMyAdminやpgAdmin/MongoDB Compassなどに接続して操作可能です。MySQL/MariaDBの場合、デフォルトユーザー名はroot
、パスワードはpassword
。PostgreSQLも同じくroot
/password
です。テーブル作成用スクリプト記述&実行(例)
プロジェクトルートまたは一時ディレクトリに
create_users_table.php
というファイルを作り、次の内容でテーブル作成スクリプトを記述します。php<?php // create_users_table.php use Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; // ここではMySQLまたはMariaDBを例示 $adapter = new Adapter([ 'driver' => 'Pdo_Mysql', // または 'Pdo_Pgsql' 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', // ServBayのデフォルトパスワード 'hostname' => '127.0.0.1', // 'port' => 3306, // MySQLのデフォルトポート // 'port' => 5432, // PostgreSQLのデフォルトポート ]); $sql = new Sql($adapter); // usersテーブル作成SQLを定義 $create = $sql->createTable('users') ->addColumn(new \Laminas\Db\Sql\Ddl\Column\Integer('id', false, null, ['AUTO_INCREMENT' => true])) ->addColumn(new \Laminas\Db\Sql\Ddl\Column\Varchar('name', 255)) ->addColumn(new \Laminas\Db\Sql\Ddl\Column\Varchar('email', 255, ['UNIQUE' => true])) ->addConstraint(new \Laminas\Db\Sql\Ddl\Constraint\PrimaryKey('id')); echo "Executing SQL:\n"; echo $sql->buildSqlString($create, $adapter->getPlatform()) . "\n"; try { // SQL実行 $adapter->query( $sql->buildSqlString($create, $adapter->getPlatform()), Adapter::QUERY_MODE_EXECUTE ); echo "Table 'users' created successfully.\n"; } catch (\Exception $e) { echo "Error creating table: " . $e->getMessage() . "\n"; }
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注意: これは手動の例であり、実業務ではLaminas Migrationsツールによるマイグレーション管理を推奨します。
PHP CLIからスクリプトを実行してテーブル作成:
bashphp create_users_table.php
1
MySQL連携サンプル
Zend Frameworkコントローラー内でMySQLデータベースに接続・データ操作する例です。
DB接続設定
config/autoload/global.php
を編集し、MySQL接続設定を追記します。既にdb
設定ブロックがある場合は内容を修正、ない場合は下記を追加してください。php<?php // config/autoload/global.php return [ 'db' => [ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', // 必ず存在するDB名に 'username' => 'root', // デフォルトユーザー名 'password' => 'password', // デフォルトパスワード 'hostname' => '127.0.0.1', 'port' => 3306, // MySQLデフォルトポート 'charset' => 'utf8mb4', ], // ... 他のグローバル設定 ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14コントローラーファクトリの設定(module.config.php)
コントローラーで
Laminas\Db\Adapter\Adapter
をDI注入したい場合、IndexController
用のファクトリを設定します。InvokableFactory
定義があれば下記に置き換えます。php<?php // module/Application/config/module.config.php namespace Application; use Laminas\ServiceManager\Factory\InvokableFactory; // 引き続き他で利用する場合はuseだけ残す use Laminas\Db\Adapter\AdapterInterface; // 追加 return [ // ... 他の設定 'controllers' => [ 'factories' => [ Controller\IndexController::class => function($container) { // ServiceManagerからDBアダプタ取得 $adapter = $container->get(AdapterInterface::class); // アダプタ注入済みコントローラインスタンスを返す return new Controller\IndexController($adapter); }, // 他コントローラーも必要に応じて追加 ], ], 'service_manager' => [ 'aliases' => [ // Laminas\Db\Adapter\AdapterInterfaceのエイリアス設定 AdapterInterface::class => 'Laminas\Db\Adapter\Adapter', ], 'factories' => [ // Laminas\Db\Adapter\Adapterファクトリ定義 'Laminas\Db\Adapter\Adapter' => \Laminas\Db\Adapter\AdapterServiceFactory::class, ], ], // ... 他の設定 ];
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注意: 必要な部分だけ既存の設定へマージし、
service_manager
で上記2行が必ず含まれるようにしてください。ルーティング追加(module.config.php)
module/Application/config/module.config.php
でMySQL用の新ルートを追加します。php<?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; // ... その他use return [ 'router' => [ 'routes' => [ // ... 既存ルート('home'など) 'mysql-add' => [ 'type' => Literal::class, 'options' => [ 'route' => '/mysql-add', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'mysqlAdd', ], ], ], 'mysql' => [ 'type' => Literal::class, 'options' => [ 'route' => '/mysql', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'mysql', ], ], ], ], ], // ... その他の設定 ];
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上記を
router
配列内'routes'
キーの中に追加します。コントローラーのメソッド追加(IndexController.php)
module/Application/src/Controller/IndexController.php
を編集し、コンストラクタでDIしたアダプタを使ったmysqlAddAction
とmysqlAction
メソッドを追加します。php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\AdapterInterface; // 追加 use Laminas\Db\Sql\Sql; // 追加 class IndexController extends AbstractActionController { private $adapter; // プロパティ追加 // コンストラクタでアダプタ注入 public function __construct(AdapterInterface $adapter) { $this->adapter = $adapter; } /** * デフォルトアクション:ウェルカム表示 */ public function indexAction() { return new ViewModel([ 'message' => 'Hello ServBay!', ]); } /** * MySQL:usersテーブルへユーザー追加 */ public function mysqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay Demo User', 'email' => '[email protected]', // サンプルメールアドレス ]); $statement = $sql->prepareStatementForSqlObject($insert); $result = $statement->execute(); $message = $result->getAffectedRows() > 0 ? 'MySQL User added successfully.' : 'Failed to add MySQL user.'; return new ViewModel([ 'message' => $message, ]); } /** * MySQL:usersテーブルから全ユーザーを取得 */ public function mysqlAction() { $sql = new Sql($this->adapter); $select = $sql->select('users'); $statement = $sql->prepareStatementForSqlObject($select); $result = $statement->execute(); $users = []; foreach ($result as $row) { $users[] = $row; } // 結果をJSON文字列でビューに渡す return new ViewModel([ 'users' => json_encode($users, JSON_PRETTY_PRINT), ]); } // ... その他アクション }
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上記コンストラクタと2つのアクションを
IndexController
へ追加してください。ビューの作成
module/Application/view/application/index/mysql-add.phtml
を作成:php<h1><?php echo $this->message; ?></h1>
1module/Application/view/application/index/mysql.phtml
を作成:php<h1>MySQL Users</h1> <pre><?php echo $this->users; ?></pre>
1
2MySQL連携サンプルへのアクセス
ServBayでMySQLサービスが稼働していることを確認。 まず
https://servbay-zend-test.local/mysql-add
を開くと「MySQL User added successfully.」と表示されます。 次にhttps://servbay-zend-test.local/mysql
でusers
テーブルのJSONデータが確認できます。
PostgreSQL連携サンプル
Zend FrameworkコントローラーでPostgreSQL DBに接続・操作する例です。
DB接続設定
config/autoload/global.php
でPostgreSQL接続設定を下記のように記述(MySQLと併用したい場合は環境ごとに設定変更が必要)。php<?php // config/autoload/global.php return [ 'db' => [ 'driver' => 'Pdo_Pgsql', 'database' => 'servbay_zend_app', // DBが存在すること 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', 'port' => 5432, // PostgreSQLデフォルトポート ], // ... その他 ];
1
2
3
4
5
6
7
8
9
10
11
12
13コントローラーファクトリ設定(module.config.php)
(MySQL例と同様)
indexController
へのアダプタDIファクトリが適切に設定されていることを確認してください。ルート設定(module.config.php)
PostgreSQL用の新規ルートを追加します。
php<?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; // ... その他use return [ 'router' => [ 'routes' => [ // ... 既存ルート('home', 'mysql-add', 'mysql'など) 'pgsql-add' => [ 'type' => Literal::class, 'options' => [ 'route' => '/pgsql-add', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'pgsqlAdd', ], ], ], 'pgsql' => [ 'type' => Literal::class, 'options' => [ 'route' => '/pgsql', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'pgsql', ], ], ], ], ], // ... 他の設定 ];
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
35Routerの
'routes'
配列内に追加してください。コントローラーメソッド追加(IndexController.php)
module/Application/src/Controller/IndexController.php
に下記2メソッドを追加します。php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\AdapterInterface; use Laminas\Db\Sql\Sql; class IndexController extends AbstractActionController { private $adapter; public function __construct(AdapterInterface $adapter) { $this->adapter = $adapter; } // ... 既存アクション(indexAction, mysqlAddAction, mysqlActionなど) /** * PostgreSQL:usersテーブルへユーザー追加 */ public function pgsqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay Demo User', 'email' => '[email protected]', // サンプルメール ]); $statement = $sql->prepareStatementForSqlObject($insert); $result = $statement->execute(); $message = $result->getAffectedRows() > 0 ? 'PostgreSQL User added successfully.' : 'Failed to add PostgreSQL user.'; return new ViewModel([ 'message' => $message, ]); } /** * PostgreSQL:usersテーブルから全ユーザー取得 */ public function pgsqlAction() { $sql = new Sql($this->adapter); $select = $sql->select('users'); $statement = $sql->prepareStatementForSqlObject($select); $result = $statement->execute(); $users = []; foreach ($result as $row) { $users[] = $row; } // 結果をJSON文字列でビューに渡す return new ViewModel([ 'users' => json_encode($users, JSON_PRETTY_PRINT), ]); } }
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上記メソッドを
IndexController
クラス内に追加してください。ビュー作成
module/Application/view/application/index/pgsql-add.phtml
を作成:php<h1><?php echo $this->message; ?></h1>
1module/Application/view/application/index/pgsql.phtml
を作成:php<h1>PostgreSQL Users</h1> <pre><?php echo $this->users; ?></pre>
1
2PostgreSQL連携サンプルの確認
ServBayでPostgreSQLサービスが動作していることを確認。
https://servbay-zend-test.local/pgsql-add
でユーザー追加、「PostgreSQL User added successfully.」が表示されます。https://servbay-zend-test.local/pgsql
でテーブルデータがJSON形式で確認できます。
Memcached連携サンプル
Zend FrameworkコントローラーからMemcachedを使ったキャッシュ操作例です。
Memcachedアダプターのインストール
ComposerでLaminas CacheのMemcachedアダプターを追加し、
composer update
を実行してください。json// composer.json { "require": { "laminas/laminas-skeleton-application": "^1.0", "laminas/laminas-cache-storage-adapter-memcached": "^2.0" // 追加 // ... 他の依存 }, // ... 他の設定 }
1
2
3
4
5
6
7
8
9その後
bashcomposer update
1ServBayにはPHPの
memcached
エクステンションがプリインストール済みです。ルーティング設定(module.config.php)
Memcachedサンプル用の新ルートを追加します。
php<?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; // ... 他use return [ 'router' => [ 'routes' => [ // ... 既存ルート 'memcached' => [ 'type' => Literal::class, 'options' => [ 'route' => '/memcached', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'memcached', ], ], ], ], ], // ... 他の設定 ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25Routerの
routes
配列内へ追加してください。コントローラーメソッド追加(IndexController.php)
module/Application/src/Controller/IndexController.php
にmemcachedAction
を追加。php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; // ... 他use (AdapterInterface, Sqlなど) use Laminas\Cache\StorageFactory; // 追加 use Laminas\Cache\Storage\StorageInterface; // 追加 class IndexController extends AbstractActionController { // ... 既存アクション /** * Memcached操作のデモアクション */ public function memcachedAction() { // Memcachedキャッシュストレージ生成 // ServBayのMemcachedはデフォルトで127.0.0.1:11211 $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'memcached', 'options' => [ 'servers' => [ ['127.0.0.1', 11211], ], 'ttl' => 300, // 有効期限300秒 ], ], 'plugins' => [ 'serializer', 'exception_handler' => ['throw_exceptions' => false], ], ]); $cacheKey = 'my_memcached_data'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { // キャッシュ未ヒット時 $cachedData = 'Hello Memcached! (Data from source, cached at ' . date('Y-m-d H:i:s') . ')'; $cache->setItem($cacheKey, $cachedData); $cachedData .= ' - CACHE MISS'; } else { // キャッシュヒット時 $cachedData .= ' - CACHE HIT'; } return new ViewModel([ 'message' => $cachedData, ]); } }
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上記メソッドを
IndexController
内へ追加してください。ビュー作成
module/Application/view/application/index/memcached.phtml
を作成:php<h1>Memcached Example</h1> <p><?php echo $this->message; ?></p>
1
2Memcached連携サンプルの確認
ServBayでMemcachedサービスが稼働していることを確認。
https://servbay-zend-test.local/memcached
へ初回アクセス時「CACHE MISS」付きメッセージが表示されます。 その後(300秒以内の再アクセスで)「CACHE HIT」に変化、タイムスタンプが更新されないことからキャッシュ済みデータ取得がわかります。
Redis連携サンプル
Zend FrameworkコントローラーからRedisのキャッシュ・ストレージ操作例です。
Redisアダプターのインストール
ComposerでLaminas CacheのRedisアダプター(および
ext-redis
拡張)追加。composer update
で更新します。json// composer.json { "require": { "laminas/laminas-skeleton-application": "^1.0", "laminas/laminas-cache-storage-adapter-redis": "^2.0", // 追加 "ext-redis": "*" // PHPのredis拡張が必要 // ... 他の依存 }, // ... その他 }
1
2
3
4
5
6
7
8
9
10その後
bashcomposer update
1ServBayにはPHPの
redis
拡張もプリインストール済みです。ルーティング設定(module.config.php)
Redisサンプル用の新ルートを追加します。
php<?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; // ... 他のuse return [ 'router' => [ 'routes' => [ // ... 既存ルート 'redis' => [ 'type' => Literal::class, 'options' => [ 'route' => '/redis', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'redis', ], ], ], ], ], // ... 他の設定 ];
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'routes'
配列に追加してください。コントローラーメソッド追加(IndexController.php)
module/Application/src/Controller/IndexController.php
にredisAction
を追加します。php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; // ... 他のuse use Laminas\Cache\StorageFactory; // 追加 use Laminas\Cache\Storage\StorageInterface; // 追加 class IndexController extends AbstractActionController { // ... 既存アクション /** * Redis操作のデモアクション */ public function redisAction() { // Redisキャッシュストレージ生成 // ServBayのRedisはデフォルトで127.0.0.1:6379 $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'redis', 'options' => [ 'server' => [ 'host' => '127.0.0.1', 'port' => 6379, // 'database' => 0, // 任意でデータベース番号 // 'password' => null, // パスワードがある場合 ], 'ttl' => 300, // 有効期限300秒 ], ], 'plugins' => [ 'serializer', 'exception_handler' => ['throw_exceptions' => false], ], ]); $cacheKey = 'my_redis_data'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Redis! (Data from source, cached at ' . date('Y-m-d H:i:s') . ')'; $cache->setItem($cacheKey, $cachedData); $cachedData .= ' - CACHE MISS'; } else { $cachedData .= ' - CACHE HIT'; } return new ViewModel([ 'message' => $cachedData, ]); } }
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上記メソッドを追加してください。
ビュー作成
module/Application/view/application/index/redis.phtml
を作成:php<h1>Redis Example</h1> <p><?php echo $this->message; ?></p>
1
2Redis連携サンプルの確認
ServBay上でRedisサービス起動後、
https://servbay-zend-test.local/redis
へアクセスします。初回アクセスで「CACHE MISS」付きメッセージが、2回目以降(300秒以内)「CACHE HIT」と表示され、同じ内容(タイムスタンプ)がキャッシュから取得されていることが確認できます。
総まとめ
以上の手順で、ServBayのローカル開発環境上でZend Framework(Laminas)プロジェクトを作成し、Webサーバーをプロジェクトのpublicディレクトリに向けて設定、MySQLやPostgreSQLのDB、MemcachedやRedisのキャッシュ連携まで一通り実践できました。
ServBayを使えば、ローカル開発環境の構築・管理が驚くほどシンプルになり、コーディングと開発業務に集中できます。豊富なパッケージと柔軟な設定でローカルに本番さながらの環境が再現でき、開発効率の大幅な向上に繋がります。