概要
phpredis は、PHP 言語から Redis データベースにアクセスするための高性能な拡張機能です。このドキュメントでは、拡張機能のインストール方法から、主要なコマンドの使い方までを解説します。
環境構築と設定
phpredis を利用するには、まずシステムに拡張機能をインストールする必要があります。
拡張機能のインストール
ソースコードからビルドする場合、以下の手順に従います。
phpize
./configure --enable-redis-igbinary
make && make install
igbinary によるシリアライゼーションを有効にする場合は、configure オプションに--enable-redis-igbinaryを指定します。ビルド後、php.iniまたは配置先の conf.d ディレクトリにextension = redis.soを追加してモジュールを有効化してください。
OSX 環境での構築
macOS でコンパイルエラーが発生する場合、環境変数を設定して再試行します。
export MACOSX_DEPLOYMENT_TARGET=10.6
export CFLAGS="-arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp"
export CCFLAGS="-arch i386 -arch x86_64 -g -Os -pipe"
export CXXFLAGS="-arch i386 -arch x86_64 -g -Os -pipe"
export LDFLAGS="-arch i386 -arch x86_64 -bind_at_load"
Homebrew を利用している場合は、brew install php-redisなどのコマンドで簡易にインストール可能です。
PHP セッションハンドラとしての利用
phpredis をセッション保存領域として使用するには、php.iniで以下の設定を行います。
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?weight=1&timeout=2.5"
save_path には、_weight_(重み付け)、_timeout_(接続タイムアウト)、_persistent_(永続接続)、_prefix_(キープレフィックス)、_auth_(認証)、_database_(DB 番号)などのパラメータを指定できます。
クラスと基本操作
phpredis は主にRedisクラスを提供し、エラー発生時にはRedisExceptionをスローします。
インスタンスの生成
$client = new \Redis();
接続管理
サーバーへの接続には、標準的なconnectと、プロセス間で接続を再利用するpconnectがあります。
connect
Redis インスタンスへ接続します。
$client->connect('127.0.0.1', 6379, 2.5); // 2.5 秒のタイムアウト
$client->connect('/tmp/redis.sock'); // Unix ソケット経由
pconnect
永続接続を確立します。リクエスト終了後も接続は維持されます。
$client->pconnect('127.0.0.1', 6379, 2.5, 'unique_pool_id');
認証とデータベース選択
$client->auth('secure_password');
$client->select(1); // DB 1 へ切り替え
オプション設定
シリアライザやプレフィックスなどのクライアントオプションを設定できます。
$client->setOption(\Redis::OPT_PREFIX, 'app_namespace:');
$client->setOption(\Redis::OPT_SERIALIZER, \Redis::SERIALIZER_PHP);
サーバー管理コマンド
サーバーの状態確認や管理を行うコマンドです。
- info: サーバーの統計情報を取得
- dbSize: 現在のデータベースのキー数を返す
- flushDb: 現在のデータベースの全キーを削除
- save / bgSave: データセットをディスクへ保存(同期/非同期)
- config: 設定パラメータの取得または変更
$stats = $client->info();
$count = $client->dbSize();
$client->config('SET', 'maxmemory', '256mb');
文字列とキー操作
基本的なキーバリュー操作です。
set / get
キーへの値の設定と取得です。オプションで有効期限を指定できます。
$client->set('user:1001:name', 'Tanaka', ['nx', 'ex' => 3600]);
$name = $client->get('user:1001:name');
del / exists
キーの削除と存在確認です。
$client->del('temp_data');
$exists = $client->exists('user:1001:name');
incr / decr
数値の増減操作です。
$client->incr('visit_count');
$client->decrBy('error_count', 5);
mGet / mSet
複数キーの同時操作です。
$client->mSet(['key_a' => 'val_a', 'key_b' => 'val_b']);
$values = $client->mGet(['key_a', 'key_b']);
ハッシュ操作
オブジェクトのようなフィールド構造を扱えます。
hSet / hGet
$client->hSet('product:500', 'price', 1980);
$price = $client->hGet('product:500', 'price');
hGetAll / hDel
$allFields = $client->hGetAll('product:500');
$client->hDel('product:500', 'price');
hIncrBy
ハッシュフィールドの数値を増加させます。
$client->hIncrBy('product:500', 'stock', -1);
リスト操作
キューやスタックとして利用可能なリスト構造です。
lPush / rPop
$client->lPush('job_queue', 'process_task_01');
$job = $client->rPop('job_queue');
lRange / lLen
$items = $client->lRange('job_queue', 0, -1);
$length = $client->lLen('job_queue');
blPop
リストが空の場合、要素が追加されるまでブロックします。
$result = $client->blPop(['queue_high', 'queue_low'], 10);
セット操作
重複を許さない集合操作です。
sAdd / sMembers
$client->sAdd('tags:article:1', 'php', 'redis', 'tutorial');
$tags = $client->sMembers('tags:article:1');
sInter / sUnion
複数のセットの共通部分や和集合を取得します。
$common = $client->sInter('set_a', 'set_b');
$all = $client->sUnion('set_a', 'set_b');
ソート済みセット操作
スコア付きで要素をソートして管理します。
zAdd / zRange
$client->zAdd('leaderboard', 1500, 'player_a');
$client->zAdd('leaderboard', 2000, 'player_b');
$ranking = $client->zRange('leaderboard', 0, -1, true); // スコア付き
zRemRangeByScore
指定したスコア範囲の要素を削除します。
$client->zRemRangeByScore('leaderboard', 0, 1000);
ジオスペース機能
地理位置情報に基づく検索が可能です。
geoAdd / geoDist
$client->geoAdd('locations', 139.6917, 35.6895, 'Tokyo');
$client->geoAdd('locations', 135.5023, 34.6937, 'Osaka');
$distance = $client->geoDist('locations', 'Tokyo', 'Osaka', 'km');
geoRadius
指定した座標からの半径内のメンバーを取得します。
$nearby = $client->geoRadius('locations', 139.6917, 35.6895, 500, 'km', ['WITHDIST']);
Pub/Sub
メッセージング機能です。
publish / subscribe
// 送信
$client->publish('channel_news', 'Breaking News!');
// 受信(コールバック関数が必要)
$client->subscribe(['channel_news'], function($redis, $channel, $message) {
echo "Received: $message on $channel";
});
トランザクション
複数のコマンドを原子性地実行します。
multi / exec
$client->multi()
->set('account:A', 100)
->set('account:B', 200)
->exec();
watch
競合状態を防ぐためにキーを監視します。
$client->watch('counter');
$tx = $client->multi();
$tx->incr('counter');
$result = $tx->exec(); // 監視中に更新されると FALSE が返る
スクリプティング
Lua スクリプトをサーバー側で実行できます。
eval
$result = $client->eval("return ARGV[1] .. ARGV[2]", 0, 'Hello', 'World');
script
スクリプトのロードや管理を行います。
$sha = $client->script('load', "return 1");
$client->evalSha($sha);
イントロスペクション
接続状態や設定を確認するメソッドです。
- isConnected: 接続状態の確認
- getHost / getPort: 接続先のホストとポート
- getPersistentID: 永続接続 ID の取得
- getLastError: 最後のエラーメッセージ取得
if ($client->isConnected()) {
echo "Connected to " . $client->getHost();
}