macOS(Mac OS X)にPhpRedisをインストール

# 概要

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ファイルを[ダウンロード](https://github.com/phpredis/phpredis)します。GitHubなのでgit cloneでもいいかと思います。
ブラウザでダウンロードしたZIPファイル/opt/local/srcの下に移動し、unzipで展開して作業をしました。
ちなみにビルド自体はどのディレクトリで行っても、make install時に適切なディレクトリにコピーするようにconfigureで指定していれば問題はないでしょう。**酔っ払っていたので、なぜか/opt/local/srcディレクトリを作って作業した**にすぎません…。

[https://github.com/phpredis/phpredis](https://github.com/phpredis/phpredis)

これまた**酔っ払ってdevelopブランチを持ってきていますが**、ちゃんとstableブランチ(3.0.0のTagなど)を持ってくることをお勧めします(というかMacならHomeBrewかMacPortsのほうがお勧めなんですけどね…)。

```shell-session:PhpRedisの展開
> 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のオプションを指定しました。

```shell-session:configureの実行
# ./configure --prefix=/opt/local --exec-prefix=/opt/local --with-php-config=/opt/local/bin/php-config56
```

configureが無事に通ったら、makeとtestとinstallを行います。

```shell-session:makeとtestとinstall
# make && make test && make install
```

### 余談:OS Xでビルドが失敗する場合

GitHubの[README.markdown](https://github.com/phpredis/phpredis/blob/3.0.0/README.markdown)を読むとわかるのですが、OS Xでビルドする場合でfailしてしまう場合は、以下を環境変数に追加してビルドを試みるよう推奨されています。

```shell-session: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がどこにインストールされているのかは、次のように確認すればよいでしょう(出力されるディレクトリが異なるので、これをコピペしないように注意してください)。

```shell-session:php.iniの設定
# php-config56 --extension-dir
/opt/local/lib/php56/extensions/no-debug-non-zts-20131226
```

このディレクトリにredis.soファイルがあればOKです。findでもlsでもいいので、インストールされていることを確認しておきましょう。

```shell-session:findもしくはlsでredis.soの存在を確認
# 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が他にもあれば、同じ並びの末尾に書き添えてあげればいいでしょう。

```shell-session:php.iniに設定した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を起動しておいてください**。

```shell-session:redis-serverの起動
# redis-server &
```

じつに簡単、かつテキトーなPHPのサンプルコードで試してみます。
Redisの基本である文字列型を使って、キーhogeに値ngangaを入れます。その直後に、キーhogeの値をSETから取得して表示するという、ごく簡単な動作確認です。テストコードなのでエラー処理とかはまったく入れていません。

```php:test.php
<?php
$r = new Redis();
$r->connect('localhost', 6379);
$r->set('hoge', 'nganga');
echo $r->get('hoge')."\n";
```

これを、実行してみましょう。

```shell-session:test.phpの実行
> php56 test.php
nganga
```

さて、実際にRedisにデータが入っているのでしょうか。
別の手段で確認します。redis-cliで確認すればよいでしょう。

```shell-session:
> redis-cli
127.0.0.1:6379> get hoge
nganga
```

あたりまえですが、同じ結果が表示されました。

# 余談:PHPセッションを保存する場合の設定

PhpRedisでは、PHPセッションをRedisに保存する仕組みも提供されています。詳しくは、以下の記事をご参考ください。どのパッケージシステムから(あるいはソースから)PhpRedisをインストールしても、PhpRedisが利用可能な状態であれば、設定そのものはOSや環境に大きく依存することはありません。

参考: [PHPセッションをPhpRedisに保存する](http://qiita.com/zurazurataicho/items/a71437412410955afd44)