当我尝试通过Apache(不使用PHP)来管理使用Memcached的会话时,遇到了在文件中写入并陷入困境的问题
的PHP应用程序会话管理并不是通过文件,而是通过Memcached来管理。当我想到这个想法时,我遇到了一个问题:会话实际上被写入了本地文件中。所以我写下了这个笔记来记录整个过程。顺便提一句,我搭建的测试PHP应用程序是Owncloud。
这次为了建立测试而委托yum安装各种中间件,所以问题是因为这里有一些无法识别的部分。
版本信息
编辑 .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() 的内容
我在这里意识到,Local Value和Master Value是不同的。由于我在PHP方面接触不多,所以忽略了一些基本的内容。研究了一下Local Value和Master Value的区别,发现存在以下的差异(如果有错误,请谅解)。
因为已经在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的查看。
启动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中了。