Apache（×PHP）経由でセッションをMemcachedで管理しようとした際に、ファイルに書きだされてハマった点

PHPのアプリのセッション管理をファイルではなく、Memcachedで管理しようと思った際に、セッションがローカルファイルに書きだされてハマったので、流れをメモとして残す。
ちなみに、PHPのアプリはテストとして構築したOwncloud。
[Owncloud](http://owncloud.jp/)

今回、テスト構築のために`yum`に任せて各ミドルウェアをインストールしていたので、こちらで認識できていない部分があったのが問題だった。

###バージョン情報

| ソフトウェア |バージョン|
|:----------|:------------|
|CentOS|7.1|
|Apache|1.9.4|
|PHP|5.6.17|
|Memcached|1.4.22|

###1. `.ini`を編集し、セッションの向き先をMemcachedに向ける
PHPのセッション管理を`File`から`Memcached`に変更するために、以下を変更。

```/etc/php.ini
$ vi /etc/php.ini
[Session]
; Handler used to store/retrieve data.
; http://php.net/session.save-handler
; session.save_handler = files   ;コメントアウト
session.save_handler = memcached  ;追記
 
;session.save_path = "/tmp"            ;コメントアウト
session.save_path = "localhost:11211"  ;追記
```

参考：[PHPのセッション管理にmemcacheを使う時の設定](http://blog.jicoman.info/2014/03/php_session_save_memcached/)

設定内容の確認。

```
$ php -i | grep session.save
session.save_handler => memcached => memcached
session.save_path => localhost:11211 => localhost:11211
```

セッションの管理先が`memcached`になっていることを確認。
この後、この設定が悩む原因となった。

`memcached`を起動し、初期値を確認。

```
$ systemctl start memcached
$ memcached-tool localhost dump | strings
Dumping memcache contents
  Number of buckets: 0
  Number of items  : 
```

*文字化けしないように`strings `を付けて実行しています。

テスト用のコードを準備し実行。

```~/session_test.php
$ vi ~/session_test.php
<?php
session_start();
```

上記のコードを実行し、memcached上でsessionが管理されていることを確認。

```
$ php ~/session_test.php
$ memcached-tool localhost dump | strings
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 1
Dumping bucket 2 - 1 total items
add memc.sess.key.5gj73i8d0s0pgon8dfe0v1rqq5 0 1449816333 0 
```

上記のように、memcachedにセッションが反映されることが分かった。

###2. [問題発覚]Apache経由でMemcachedにアクセスさせる。

今回、ハマった点としては、こちらのコードを`Apache`経由で実行した際にローカルの`File`に書きだされてしまうという問題である。
テスト用のコードをApache用に少し修正し、ドキュメントルートに配置。

```php
<html>
  <h1>memcachedのセッションテスト<h1>
  <?php
	session_start();
  ?>
<html>
```

事前にmemcachedを再起動し、初期化

```
$ systemctl restart memcached
$ memcached-tool localhost dump | strings
Dumping memcache contents
  Number of buckets: 0
  Number of items  : 
```

先ほど、作成したファイルにブラウザからアクセスする。
そして、memcached上でsessionが管理されていることを確認。

```
$ stemctl restart memcached
$ memcached-tool localhost dump | strings
Dumping memcache contents
  Number of buckets: 0
  Number of items  : 
```

すると、memcachedには何も反映されず、ローカルのセッションパス`session.save_path`である`/var/lib/php/session`を確認すると、こちらに保存されていた模様。

再び、PHPの設定を確認。

```
$ php -i | grep session.save
session.save_handler => memcached => memcached
session.save_path => localhost:11211 => localhost:11211
```

こちらを見る限り`memcached`を向いていたので問題なさそうだったので、続いて`phpinfo()`を確認することで、解決に至った。

###3. [問題解決]Memcachedにアクセスさせるために、Apacheの設定を編集。

`phpinfo()`の内容を確認

| Directive |Local Value	| Master Value|
|:----------|:------------|:------------|
|session.save_handler|file|memcached|
|session.save_path|/var/lib/php/session|localhost:11211|

ここで気づいたのだが、`Local Value`と`Master Value`が異なっている。PHPにあまり接点がなかったこともあり、基本的なところを見逃していた。この`Local Value`と`Master Value`の違いを調べてみたところ、以下のような違いがあるとのこと。（間違っていたら、すみません。）

|Local Value|Master Value|
|:----------|:------------|
|httpd.confや.htaccessの設定|php.iniや各.iniの設定|

確かに`Master Value`に関わる設定は、すでにmemcachedを向けていたので、`Apache`の設定周りを確認してみた。

```
$ find /etc/httpd/conf* -name "*" -print | xargs grep -l "session.save" 
grep: /etc/httpd/conf: Is a directory
grep: /etc/httpd/conf.d: Is a directory
/etc/httpd/conf.d/php.conf
grep: /etc/httpd/conf.modules.d: Is a directory
$ cat /etc/httpd/conf.d/php.conf | grep "session.save"
    php_value session.save_handler "file"
    php_value session.save_path    "/var/lib/php/session"
```

すると、セッションに関する記述を発見。どうやら、この設定が影響していた模様。こちらを修正する。

```
$ vi /etc/httpd/conf.d/php.conf
$ cat /etc/httpd/conf.d/php.conf | grep "session.save"
    php_value session.save_handler "memcached"
    php_value session.save_path    "localhost:11211"
$ systemctl start httpd
```

再びphpinfo()の内容を確認したところ、`Local Value`もmemcachedを見るように反映されていた。

| Directive |Local Value	| Master Value|
|:----------|:------------|:------------|
|session.save_handler| memcached |memcached|
|session.save_path|localhost:11211|localhost:11211|


`memcached`を起動し、初期値を確認。

```
$ systemctl start memcached
$ memcached-tool localhost dump | strings
Dumping memcache contents
  Number of buckets: 0
  Number of items  : 
```

再び、先ほどのテストコードにブラウザからアクセスし`memcached`を確認してみると、無事に動いていることが確認できた。

```
$ memcached-tool localhost dump | strings
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 1
Dumping bucket 2 - 1 total items
add memc.sess.key.5gj73i8d0s0pgon8dfe0v1rqq5 0 1449816333 0 
```

ようやく`apache`経由でも`memcached`にセッションが保存させることができた。