[实践Ok]PHP用memcache作为session的存放时遇到的问题备案。

jackxiang 2013-1-18 18:06 | |
Session其实是和cookie有联系的,通过session_id()作为浏览器里的cookie发送给浏览器,下次浏览器就像PHP客户端发送这个session_id(Cookie)后,服务器于是就知道这个用户是谁,通过session_id获取到所有的当前用户设置的session数组,因session是隐私,所以,在一个PHP里是没法获取到所有用户的session的,只能获取到当前,要想获取所有的,得记录到文件中(有session的用户访问)才行获取到程序设置的session值,否则,只能从服务器里的session文件中去提取(可能要对文件进行破解)。



背景:
    今天搞什么东东,突然windows7死机了,于是重启动,发现验证码登录不进了,提示错误,于是否,我还以为是代码修改的问题,但我也没有修改那个关于session那一块的代码啊,于是否,我一看php.ini里的配置,发现这个:
session.save_path = "d:/wamp/tmp"
和xdebug里的配置一样的目录,还以为是死机会出现了文件的错误等,如下:
[xdebug]
xdebug.profiler_output_dir = "d:/wamp/tmp"
于是,修改成了下面这个:
session.save_path = "d:/wamp/session"
再进行访问,还是有错,于是我打开d:/wamp/session目录,发现没有一个session文件存在,于是否,在localhost里建立了一个index.php文件,写入phpinfo();访问了一下这个页面发现session这一块有如下设置:

有一个memcache的东东,我怀疑是不是这个session是用memcache来存的呢?于是否,我杀死memcache,在windows服务里重启memcache(services.msc),再登录,发现好了,于是否,我问了下同事:我们这个验证码的session是存在memcache里的么?
刚才电脑死机了一直验证码错误,后来我就重启动memcache就好了。 回答是的,于是明白了:为何session文件夹里没有文件了。
这里也要注意,不要把session的文件夹和xdebug的输出文件混起来放一个文件,尽管是开发,还是要注意适度规范下。

下面讲这个是怎么把php里的session放入memcache里的,如下文章转载:
memcache PHP 的 session.save_handler
也就是可以直接用 memcache 来作 PHP 的 session.save_handler。
1. 安装 memcached,还是那套 ./configure; make; make install,注意 memcached 用 libevent 来作事件驱动,所以要先安装有 libevent。
2. 安装 pecl::memcache,用 pecl 命令行工具安装:
pecl install memcache
或直接从源码安装:
phpize ./configure make make install
将 php.ini 中 extension=memcache.so 打开,重启一下 apache,查看 phpinfo 中的 "Registered save handlers" 会有 "files user memcache" 这3个可用。
3. 修改配置文件,在 php.ini 中全局设置:


或者某个目录下的 .htaccess :
php_value session.save_handler "memcache"php_value session.save_path  "tcp://127.0.0.1:11211"
再或者在某个一个应用中:


使用多个 memcached server 时用逗号","隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等等,类似这样的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。
4. 启动 memcached:
memcached -d -l 127.0.0.1 -p 11212 -m 128
5. 在程序中使用 memcache 来作 session 存储,用例子测试一下:

6. 用 sessionid 去 memcached 里查询一下:


会有看到
string(37) "TEST|i:1177556731;TEST3|i:1177556881;"
这样的输出,证明 session 正常工作。
用 memcache 来存储 session 在读写速度上会比 files 时快很多,而且在多个服务器需要共用 session 时会比较方便,将这些服务器都配置成使用同一组 memcached 服务器就可以,减少了额外的工作量。缺点是 session 数据都保存在 memory 中,持久化方面有所欠缺,但对 session 数据来说也不是很大的问题。

来自:
http://www.zzxj.net/blog/fxs_2008/archive/2009/12/04/105.html



很有意思的PHP session过期机制和配置
使用PHP session时会遇到明明超过了session过期时间,但session依然完好无损的活着,让人头大。其实仔细看一下php.ini关于PHP session回收机制就一目了然了。
session 回收机制:
PHP采用Garbage Collection process对过期session进行回收,然而并不是每次session建立时,都能够唤起 'garbage collection' process ,gc是按照一定概率启动的。这主要是出于对服务器性能方面的考虑,每个session都触发gc,浏览量大的话,服务器吃不消,然而按照一定概率开启gc,当流览量大的时候,session过期机制能够正常运行,而且服务器效率得到节省。细节应该都是多年的经验积累得出的。
三个与PHP session过期相关的参数(php.ini中):
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
gc启动概率 = gc_probability / gc_divisor = 0.1%
session过期时间 gc_maxlifetime 单位:秒

来自:http://hi.baidu.com/tbjmnvbagkfgike/item/9eba52cbe064dc25a0b50aae
较为深入的理解:http://www.laruence.com/2011/03/29/1949.html

http://www.sphinxsearch.org/archives/436
php memcache保存session的一个设置误区:
php中,使用memcache作为session的save handler 一般会使用如下设置:

php.ini里:

session.save_handler = memcache
session.save_path = “localhost:11211″

项目配置里:

ini_set(“session.save_handler”, “memcache”);
ini_set(“session.save_path”, “127.0.0.1:11211″);
在网上很多资料会写成这样:
session.save_path = “tcp://localhost:11211″
就是连接前缀里添加了tcp:// 这是会导致php的memcache模块写入失败,切记一定不要添加tcp协议前缀!

原文:http://php.net/manual/en/memcached.sessions.php
session.save_path string
Defines a comma separated of hostname:port entries to use for session server pool, for example “sess1:11211, sess2:11211″.

If you want to use ‘memcacheD’ extention not ‘memcache’ (there are two diffrent extentions) for session control,  you should pay attention to modify php.ini

Most web resource from google is based on memcache because It’s earlier version than memcacheD. They will say as following

session.save_handler = memcache
session.save_path = “tcp://localhost:11211″

But it’s not valid when it comes to memcacheD

you should modify php.ini like that

session.save_handler = memcached
session.save_path = “localhost:11211″

Look, there is no protocol indentifier
KO框架里\libraries\session.php 有这样的一段,用Memcache来实现的session:

更多资料:
http://koda.iteye.com/blog/466667
http://zhengdl126.iteye.com/blog/768211

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/5952/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2013-11-19 14:07
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]