Windows: PhpRedisとPredisの使用準備

PHPから[Redis](https://redis.io/)を操作するための[PhpRedis](https://github.com/phpredis/phpredis)と[Predis](https://github.com/nrk/predis)、両方を試してみます。


# 環境
- Windows 10 (64bit)
- XAMPP 7.1.4 (PHP 7.1.4)
- PHPのアーキテクチャ: 32bit


# Redisをインストール
まずは元となるRedisをインストールします。
:link: [RedisをWindowsにインストール - Qiita](http://qiita.com/kbdx/items/fdd36e895acf2532f0bd)

特に設定をいじらなければ、`ホスト: 127.0.0.1`、`ポート: 6379`となるはずです。
また、インストールが終わったらすでに起動しています。
間違ってRedisをシャットダウンしてしまった場合は、`redis-server --service-start`とコマンドを打つよりもWindowsの`サービス`でRedisを起動する方が余計なウィンドウを減らせていいと思います。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/27816/ee043b24-7115-6b3d-240e-2e1af906d15b.png)


# GUIツールをインストール
:link: https://redisdesktop.com/
:link: [Redis Desktop Managerを使ってみる - Qiita](http://qiita.com/akiko-pusu/items/64561b4d97f4435b8645)

やっぱりGUIは便利です。
今は接続だけを済ませておいてください。

![rdm01.png](https://qiita-image-store.s3.amazonaws.com/0/27816/52a048de-6491-8516-55a3-fe37a06bc5ab.png)


# PhpRedis
:link: [GitHub - phpredis/phpredis: A PHP extension for Redis](https://github.com/phpredis/phpredis)

まずはPECL拡張モジュールのPhpRedisを試してみます。

## DLLを入手する
:link: [PHP: PHP 拡張モジュールの Windows へのインストール - Manual](http://php.net/manual/ja/install.pecl.windows.php)

> Windows では、PHP の拡張モジュールを読み込む方法は 2 通りあります。 コンパイル時に PHP に組み込む方法と、DLL として読む込む方法です。 コンパイル済みの拡張モジュールを読み込む方法のほうが簡単で、おすすめです。

DLLは下記から入手します。現時点での最新版は3.1.3のようです。
:link: http://windows.php.net/downloads/pecl/releases/redis/

私は、自分の環境に合わせて`php_redis-3.1.3-7.1-ts-vc14-x86.zip`をダウンロードしました。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/27816/f3103ad9-3458-0efe-08e0-d0d70f6f08f1.png)

バージョン番号`3.1.3`の後の`7.0`や`7.1`はPHPのバージョンです。
ts(スレッド・セーフ)かnts(ノン・スレッド・セーフ)か、x86かx64かは、`phpinfo()`の下記の項目で見分けられます。

![000.png](https://qiita-image-store.s3.amazonaws.com/0/27816/cd08f9dd-1168-e772-7730-94bdb0f04470.png)

## PhpRedisを有効にする
入手した`php_redis.dll`を`C:\xampp\php\ext`に移動します。
そして下記のように`php.ini`に追記した後、Apacheを再起動します。

:page_facing_up: `C:\xampp\php\php.ini`

```ini
extension=php_redis.dll
```

`phpinfo()`で下記のように項目が追加されていれば成功です。

![002.png](https://qiita-image-store.s3.amazonaws.com/0/27816/35d11adf-36c8-833c-848e-6aed7e78e02e.png)

`redis`の項目が追加されず、下記のようにログにエラーが記録されている場合は、間違ったDLLを入手した可能性があります。
私も、x64向けのDLLをインストールしてエラーになりました。
PHPが32ビットか64ビットかを気にしたことなんてありませんでしたよ…。

:page_facing_up: `C:\xampp\apache\logs\error.log`

```
PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\\xampp\\php\\ext\\php_redis.dll'
```

## 動作確認
下記の通り、ポートがデフォルトの6379の場合は`connect()`の引数を省略できます。
:link: https://github.com/phpredis/phpredis#example-1

```php
<?php
$redis = new Redis();
$redis->connect('127.0.0.1');
$redis->set('foo', 'こんにちはこんにちは!!');
echo $redis->get('foo'); // こんにちはこんにちは!!
```

RDMでも確認します。`Ctrl+R`でリロードしてください。
なお、値の表示は`Plain Text`をおすすめします。

![rdm02.png](https://qiita-image-store.s3.amazonaws.com/0/27816/29fff2e6-4323-e684-aa7a-15c3139ed4c9.png)


## セッションハンドラをredisに変更する
これまでと同様に`$_SESSION`を使いつつ、セッションの保存先を変更できます。
:link: https://github.com/phpredis/phpredis#php-session-handler

:page_facing_up: `C:\xampp\php\php.ini`

```ini
session.save_handler=redis
session.save_path="tcp://127.0.0.1:6379"
```

その後、Apacheを再起動して下記を実行ます。

```php
<?php
session_start();
$_SESSION['bar'] = 'Hello World!';
echo $_SESSION['bar']; // Hello World!
```

RDMで確認すると、`PHPREDIS_SESSION:onfdvajno0mfi6iim76jmge3kd`という長いキー名が与えられ、その値が`bar|s:12:"Hello World!";`となっています。

![rdm03.png](https://qiita-image-store.s3.amazonaws.com/0/27816/31fb2a6f-adfb-0558-227f-91d59c9555f8.png)

下記によると、どうやらキー名を`:`で区切ることによって階層化できるようです。
:link: [key value store - What is the purpose of colons within Redis keys - Stack Overflow](https://stackoverflow.com/questions/3554888/what-is-the-purpose-of-colons-within-redis-keys)

[PhpRedisのREADME](https://github.com/phpredis/phpredis#php-session-handler)にも、`PHPREDIS_SESSION:`という接頭辞がデフォルトで使われると書かれています。

> prefix (string, defaults to "PHPREDIS_SESSION:"): used as a prefix to the Redis key in which the session is stored. The key is composed of the prefix followed by the session ID.


# Predis
:link: [GitHub - nrk/predis: Flexible and feature-complete Redis client for PHP and HHVM](https://github.com/nrk/predis)

Predisの方はComposerで簡単に導入できます。

## Composerでインストールする
:computer: PowerShell

```
> composer require predis/predis
```

## 動作確認
```php
<?php
require_once __DIR__.'/vendor/autoload.php';
Predis\Autoloader::register();

$client = new Predis\Client();
$client->set('baz', '東京特許許可局');
echo $client->get('baz'); // 東京特許許可局
```

![rdm04.png](https://qiita-image-store.s3.amazonaws.com/0/27816/3d8c43a4-ac53-bba2-e613-59d793d89374.png)

Predisでは`$_SESSION`を使えないようですが、PredisはLaravelで使うことが大半だと思うので問題ないと思います。