PHPのアプリのセッション管理をファイルではなく、Memcachedで管理しようと思った際に、セッションがローカルファイルに書きだされてハマったので、流れをメモとして残す。
ちなみに、PHPのアプリはテストとして構築したOwncloud。
Owncloud
今回、テスト構築のためにyum
に任せて各ミドルウェアをインストールしていたので、こちらで認識できていない部分があったのが問題だった。
バージョン情報
ソフトウェア | バージョン |
---|---|
CentOS | 7.1 |
Apache | 1.9.4 |
PHP | 5.6.17 |
Memcached | 1.4.22 |
1. .ini
を編集し、セッションの向き先をMemcachedに向ける
PHPのセッション管理をFile
からMemcached
に変更するために、以下を変更。
$ 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を使う時の設定
設定内容の確認。
$ 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
を付けて実行しています。
テスト用のコードを準備し実行。
$ 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用に少し修正し、ドキュメントルートに配置。
<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
にセッションが保存させることができた。