4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-07

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に変更するために、以下を変更。

/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を使う時の設定

設定内容の確認。

$ 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用に少し修正し、ドキュメントルートに配置。

<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 ValueMaster Valueが異なっている。PHPにあまり接点がなかったこともあり、基本的なところを見逃していた。このLocal ValueMaster 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にセッションが保存させることができた。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?