ServBayでMemcachedを利用したPHPデータキャッシュ
ServBayは強力なローカルWeb開発環境として、高パフォーマンスなMemcachedサーバーおよび対応するPHP拡張モジュールをプリインストールしており、開発者がPHPアプリケーションで効率的にデータキャッシュを実現し、アプリケーションのパフォーマンスを大幅に向上させることができます。
本記事では、ServBayでMemcachedおよび対応するPHP拡張の状態確認と活用方法を詳しく解説します。
Memcached概要
Memcachedは高性能・分散型のインメモリオブジェクトキャッシュシステムです。データベースのクエリ結果、APIレスポンス、ページ断片などをメモリ上に一時的に保存することで、バックエンドストレージ(データベース等)へのアクセス頻度を下げ、動的Webアプリの応答速度・スループットを高速化します。
主な特徴
- 高パフォーマンス:データをメモリ上に保存し、読み書きが非常に高速。
- 分散型アーキテクチャ:複数サーバーにまたがる分散キャッシュプール構築が可能でスケーラビリティに優れています。
- シンプルかつ使いやすい:シンプルなプロトコル、多数のクライアントライブラリ、容易な統合。
- データベース負荷軽減:特に高トラフィック時に、DBへの問い合わせ負荷を大幅に下げます。
memcache
と memcached
PHP拡張の違い
PHPからMemcachedサーバーに接続するためによく使われる拡張モジュールには、memcache
とmemcached
の2種類があります。名前は似ていますが、APIや機能が異なる別の拡張です。
memcache
拡張:- 旧来のPHP拡張モジュール。
- 主に手続き型API(例:
memcache_connect()
,memcache_set()
など)を提供。 - 基本機能のみで、高度な機能(コンシステントハッシュ等)は未対応(クライアント実装に依存)。
memcached
拡張:- より新しいPHP拡張(libmemcachedライブラリをベースとする)。
- オブジェクト指向API(
Memcached
クラス)を提供。 - コンシステントハッシュ、バイナリプロトコル、SASL認証、柔軟なシリアライズ方式など、高度な機能をサポート。
- 機能とメンテナンス性から、通常はこちらの
memcached
拡張が推奨されます。
ServBayでは、より高機能なmemcached
PHP拡張が標準搭載され、推奨されています。
ServBayのMemcachedパッケージとPHP拡張
ServBayは、Memcachedサーバーを管理可能なパッケージとして統合するだけでなく、搭載するすべてのPHPバージョンにおいてmemcached
拡張をプリインストールし、デフォルトで有効化しています。
つまり、ほとんどの場合、ServBayをインストールするだけで、MemcachedサーバーおよびPHP拡張はすぐに利用可能となり、追加のPHP再構築や複雑な設定は不要です。
Memcachedパッケージの稼働確認:
ServBayのメイン画面またはパッケージ管理画面にてMemcached
パッケージを探し、「稼働中」となっていることを確認してください。動作していない場合は、起動をお試しください。
memcached
PHP拡張がロードされているか確認:
特定のPHPバージョンでmemcached
拡張が正しく読み込まれているかを確認するには、phpinfo()
関数を用いるのが最も簡単です。
ServBayのWebサイトのドキュメントルート(デフォルト:
/Applications/ServBay/www
)以下に、新規PHPファイル(例:info.php
)を作成します。次の内容をファイルに記述します。
php<?php phpinfo(); ?>
1
2
3ServBayで設定したローカルドメインからこのファイルにアクセスします(例:サイトドメインが
servbay.demo
の場合、http://servbay.demo/info.php
)。表示された
phpinfo
ページで「memcached」と検索し、該当セクションとバージョン情報が表示されていれば拡張が正しくロードされています。
PHPコードからMemcachedを利用する
Memcachedサーバーが稼働中かつmemcached
拡張が正しくロードされていれば、PHPアプリケーションからMemcached
クラスを使ってサーバーに接続し、キャッシュ操作を行えます。
Memcachedサーバーはデフォルトでlocalhost
の標準ポート11211
で待受しています。
サンプルコード
以下は、Memcached
クラスを使ってローカルのMemcachedサーバーに接続し、データの保存・取得を行うPHPサンプルです。
次のコードを、ServBayのサイトディレクトリ下のPHPファイル(例:/Applications/ServBay/www/memcached_test.php
)として保存してください。
<?php
// Memcachedサーバー情報
$memcached_host = 'localhost';
$memcached_port = 11211;
// Memcachedクライアントインスタンスを作成
$memcached = new Memcached();
// 接続プールにMemcachedサーバーを追加
// addServer()は正常追加でtrue、失敗でfalseを返すが、即時接続成功を意味しない
if (!$memcached->addServer($memcached_host, $memcached_port)) {
// 注意:addServer失敗はたいてい設定ミスで、サーバーアクセス失敗とは限らない
die("Memcachedサーバーの接続リストへの追加に失敗しました。ホストやポート設定をご確認ください。");
}
// 存在しないキーの取得で接続確認を実施(オプションだが推奨)
// get()がfalseや空配列なら、キーが存在しない・接続に問題の可能性
// Memcached::getResultCode()で詳細ステータスを取得
$test_key = 'servbay_memcached_connection_test';
$memcached->get($test_key); // 存在しないキーを取得してみる
$result_code = $memcached->getResultCode();
if ($result_code !== Memcached::RES_NOTFOUND && $result_code !== Memcached::RES_SUCCESS) {
// RES_NOTFOUND/RES_SUCCESS以外なら、接続異常の可能性
// RES_SUCCESSは値が空のときも返る点に注意
// より厳密な接続判定には追加ロジックやクライアント動作への依存もあり
// ローカル開発用途ならaddServer成功かつ後続操作がエラー出なければOKとみなして問題なし
echo "注意:Memcachedサーバー接続時に問題がある可能性があります。Result Code: " . $result_code . "<br>";
// 実際のアプリケーションでは詳細なエラーハンドリングが重要です
} else {
echo "Memcachedサーバー({$memcached_host}:{$memcached_port})へ正常に接続できました。<br>";
}
// --- キャッシュ操作例 ---
// キャッシュするデータ
$key = 'user_profile_1234';
$data = [
'id' => 1234,
'username' => 'servbay-demo',
'email' => '[email protected]',
'status' => 'active'
];
$expiration = 3600; // キャッシュの有効期限(秒)今回は1時間
// データの保存(キャッシュ登録)
// set()は成功時true、失敗時falseを返す
if ($memcached->set($key, $data, $expiration)) {
echo "データ(キー:'{$key}'、有効期限:{$expiration}秒)をMemcachedに正常に格納しました。<br>";
} else {
echo "データのキャッシュ登録に失敗しました!<br>";
// 失敗理由は$memcached->getResultCode()で追跡可能
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// キャッシュからデータ取得を試行
echo "キャッシュからデータ取得を試みます...<br>";
$cachedData = $memcached->get($key);
if ($cachedData !== false) { // Memcached::get()は未命中または失敗時false
echo "キャッシュからのデータ取得成功:<br>";
echo "<pre>";
print_r($cachedData);
echo "</pre>";
} else {
echo "キャッシュ未命中または取得失敗(キー:'{$key}')。<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// キャッシュ有効期限切れ時の挙動例(時間経過を仮定)
// 実アプリでは$cachedDataがfalseの場合、元データソース(DB等)から再取得してキャッシュ保存などの処理を行います。
// データ削除例
/*
echo "キャッシュデータの削除を試みます...<br>";
if ($memcached->delete($key)) {
echo "キャッシュからデータ(キー:'{$key}')を正常に削除しました。<br>";
} else {
echo "キャッシュデータの削除に失敗しました!<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// 削除したデータの再取得
echo "削除済みデータの再取得を試みます...<br>";
$cachedDataAfterDelete = $memcached->get($key);
if ($cachedDataAfterDelete !== false) {
echo "削除失敗:キャッシュにデータが残っています。<br>";
print_r($cachedDataAfterDelete);
} else {
echo "キャッシュからデータがなくなりました(正常な挙動)。<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
*/
// キャッシュ全削除例(※注意して利用!)
/*
echo "全キャッシュの削除を試みます...<br>";
if ($memcached->flush()) {
echo "全てのキャッシュデータが消去されました。<br>";
} else {
echo "キャッシュの全削除に失敗しました!<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
*/
?>
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
ServBayローカル環境からmemcached_test.php
にアクセスすると、接続状態やデータの保存・取得結果が画面に表示されます。
注意点
- Memcachedパッケージが稼働中であることを事前にご確認ください。
- Memcachedは初期設定で
127.0.0.1
(またはlocalhost
)の11211
ポートで待受します。通常変更は不要です。 - PHPから接続できない場合、Memcachedパッケージの稼働状態とローカル通信を遮断するファイアウォール有無をご確認ください。
Memcached
クラスのaddServer
メソッドは、サーバーを接続候補リストに追加するのみで、即時コネクションや可用性チェックは行いません。実際の接続や操作は以降のget
,set
等のメソッド呼び出し時に行われます。結果の返り値やgetResultCode()
で成功可否を確認できます。
まとめ
ServBayは、Memcached活用を極めて手軽にする開発環境を提供します。Memcachedパッケージの統合やmemcached
PHP拡張のプリインストール・自動有効化により、面倒なインストールや設定不要で、高速なデータキャッシュをすぐにローカル開発で実践できます。これにより、高パフォーマンスなPHPアプリ構築の基盤が、ServBay上で簡単に整います。