Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What is going on with this article?

More than 3 years have passed since last update.

@banrui

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

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
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
4
Help us understand the problem. What is going on with this article?