当我尝试通过Apache(不使用PHP)来管理使用Memcached的会话时,遇到了在文件中写入并陷入困境的问题

的PHP应用程序会话管理并不是通过文件,而是通过Memcached来管理。当我想到这个想法时,我遇到了一个问题:会话实际上被写入了本地文件中。所以我写下了这个笔记来记录整个过程。顺便提一句,我搭建的测试PHP应用程序是Owncloud。

这次为了建立测试而委托yum安装各种中间件,所以问题是因为这里有一些无法识别的部分。

版本信息

ソフトウェアバージョンCentOS7.1Apache1.9.4PHP5.6.17Memcached1.4.22

编辑 .ini 文件,将会话定向到 Memcached

为了将PHP的会话管理从文件修改为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"  ;追記

参考:在使用memcache管理PHP会话时的设置

查看设置内容。

$ 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  : 

为了避免乱码问题,我使用了字符串来执行。

准备并执行用于测试的代码。

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

执行上述代码,确认会话在memcached上得到管理。

$ 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执行这段代码时,它会将结果写入到本地文件中。我们稍微修改了用于测试的代码,并将其放置在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上得到了管理。

$ 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() 的内容

DirectiveLocal ValueMaster Valuesession.save_handlerfilememcachedsession.save_path/var/lib/php/sessionlocalhost:11211

我在这里意识到,Local Value和Master Value是不同的。由于我在PHP方面接触不多,所以忽略了一些基本的内容。研究了一下Local Value和Master Value的区别,发现存在以下的差异(如果有错误,请谅解)。

Local ValueMaster Valuehttpd.confや.htaccessの設定php.iniや各.iniの設定

因为已经在memcached中设置了Master Value,所以我检查了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()的内容后,发现本地值也已经成功地反映了对memcached的查看。

DirectiveLocal ValueMaster Valuesession.save_handlermemcachedmemcachedsession.save_pathlocalhost:11211localhost: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中了。

广告
将在 10 秒后关闭
bannerAds