概要
PHPでRedis使いたかったので、Cで書かれたPHP用RedisライブラリPhpRedisを使ってみることにしました。
なお、PHPやRedisはインストール済みであるという前提で書いています。
Homebrewにphp56-redisとかありますが、なんだか私のMacの問題なのか私自体の問題なのかbrewがうまく使えません。rootlessの問題なのか…ってそれはMacPortsでも同じだったから切ってあるのですが(本当はよろしくないのですがね…)、MacPortsは問題なく使えているのに、HomeBrewはうまく使えません。
まあ、MacPortsで困らないからいいんですけれど…。
MacPortsにもphp56-redisというのがあるので、これでインストールすれば何の問題もなくインストールはできると思います。
今回は、私が酔っ払っててport list | grep redisで確認もせずにGitHubからソースを持ってきてコンパイルしただけです、はい…。
そして酔っ払ったときのメモなので、あまり役に立たない気もしますが、自分用にメモしておきます。
ダウンロード
GithubからZIPファイルをダウンロードします。GitHubなのでgit cloneでもいいかと思います。
ブラウザでダウンロードしたZIPファイル/opt/local/srcの下に移動し、unzipで展開して作業をしました。
ちなみにビルド自体はどのディレクトリで行っても、make install時に適切なディレクトリにコピーするようにconfigureで指定していれば問題はないでしょう。酔っ払っていたので、なぜか/opt/local/srcディレクトリを作って作業したにすぎません…。
https://github.com/phpredis/phpredis
これまた酔っ払ってdevelopブランチを持ってきていますが、ちゃんとstableブランチ(3.0.0のTagなど)を持ってくることをお勧めします(というかMacならHomeBrewかMacPortsのほうがお勧めなんですけどね…)。
> sudo su - root
# cd /usr/local/src
# mv ~/Downloads/phpredis-develop.zip .
# unzip phpredis-develop.zip
# cd phpredis-develop
コンパイル
PHP5.6をMacPortsで入れていると、/opt/local配下にphp56という名前でインストールされるので、これ用にconfigureのオプションを指定しました。
# ./configure --prefix=/opt/local --exec-prefix=/opt/local --with-php-config=/opt/local/bin/php-config56
configureが無事に通ったら、makeとtestとinstallを行います。
# make && make test && make install
余談:OS Xでビルドが失敗する場合
GitHubのREADME.markdownを読むとわかるのですが、OS Xでビルドする場合でfailしてしまう場合は、以下を環境変数に追加してビルドを試みるよう推奨されています。
MACOSX_DEPLOYMENT_TARGET=10.6
CFLAGS="-arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp"
CCFLAGS="-arch i386 -arch x86_64 -g -Os -pipe"
CXXFLAGS="-arch i386 -arch x86_64 -g -Os -pipe"
LDFLAGS="-arch i386 -arch x86_64 -bind_at_load"
export CFLAGS CXXFLAGS LDFLAGS CCFLAGS MACOSX_DEPLOYMENT_TARGET
PHPの設定
php.iniにextensionsを指定して、PhpRedisライブラリが使用できるようにします。インストール先はmake installで出力されたインストール先を確認する必要があります。
PhpRedisはPHPのextensionとしてインストールされます。そのため、インストール先のディレクトリはシステムによって異なる場合があります。自分のシステムでextensionsがどこにインストールされているのかは、次のように確認すればよいでしょう(出力されるディレクトリが異なるので、これをコピペしないように注意してください)。
# php-config56 --extension-dir
/opt/local/lib/php56/extensions/no-debug-non-zts-20131226
このディレクトリにredis.soファイルがあればOKです。findでもlsでもいいので、インストールされていることを確認しておきましょう。
# find `php-config56 --extension-dir` -name redis.so
/opt/local/lib/php56/extensions/no-debug-non-zts-20131226/redis.so
もしくは
# ls -la `php-config56 --extension-dir`/redis.so
-rwxr-xr-x 1 root admin 809800 8 15 12:48 /opt/local/lib/php56/extensions/no-debug-non-zts-20131226/redis.so
php.iniには、上記で確認したパスをextensions指定子を用いて、PHP5.6がPhpRedisを利用できるように設定します。vi/vimなどのエディタを使って編集してください。extensionsが他にもあれば、同じ並びの末尾に書き添えてあげればいいでしょう。
# cat /opt/local/etc/php56/php.ini | grep redis
extension=/opt/local/lib/php56/extensions/no-debug-non-zts-20131226/redis.so
サンプルコードでの動作確認
設定がおわったら、実際にPHPからRedisが利用できるかどうかの確認を行います。テストの前にredis-serverを起動しておいてください。
# redis-server &
じつに簡単、かつテキトーなPHPのサンプルコードで試してみます。
Redisの基本である文字列型を使って、キーhogeに値ngangaを入れます。その直後に、キーhogeの値をSETから取得して表示するという、ごく簡単な動作確認です。テストコードなのでエラー処理とかはまったく入れていません。
<?php
$r = new Redis();
$r->connect('localhost', 6379);
$r->set('hoge', 'nganga');
echo $r->get('hoge')."\n";
これを、実行してみましょう。
> php56 test.php
nganga
さて、実際にRedisにデータが入っているのでしょうか。
別の手段で確認します。redis-cliで確認すればよいでしょう。
> redis-cli
127.0.0.1:6379> get hoge
nganga
あたりまえですが、同じ結果が表示されました。
余談:PHPセッションを保存する場合の設定
PhpRedisでは、PHPセッションをRedisに保存する仕組みも提供されています。詳しくは、以下の記事をご参考ください。どのパッケージシステムから(あるいはソースから)PhpRedisをインストールしても、PhpRedisが利用可能な状態であれば、設定そのものはOSや環境に大きく依存することはありません。