PHP 向け Redis 拡張機能 phpredis の導入と API リファレンス

概要

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();
}

タグ: phpredis redis php-extension NoSQL Caching

6月27日 16:21 投稿