首页 理论教育使用Memcache存放Session的实际操作

使用Memcache存放Session的实际操作

【摘要】:前面介绍的都是数据库的缓存,接下来将介绍使用Memcached缓存Session。现在可以利用Memcached的高性能,将大量的Session缓存到缓存服务器中,由于在内存中完成所有会话操作,性能将得到大幅提升。保存SessionMemcached.class.php驱动文件,将Session驱动名改为SessionMemcached,如以下代码所示。使用Memcached缓存Session,不仅可以提高系统性能,由于Memcached数据库是受内存限制的,一旦数据达到临界,服务器将根据时间顺序删除内存中的数据,在一定程度上减少CC等攻击。

前面介绍的都是数据库的缓存,接下来将介绍使用Memcached缓存Session。无论是使用哪种技术或者开发框架,Session的储存都是使用文件操作来完成的。

PHP默认将Session存放于系统临时目录下(例如/tmp),如果会话大量产生,这无疑对服务器的IO性能是一个苛刻的挑战。现在可以利用Memcached的高性能,将大量的Session缓存到缓存服务器中,由于在内存中完成所有会话操作,性能将得到大幅提升。

此外,大型网站通常都是使用负载均衡来支撑运营的,各服务器的文件系统是独立的,这就意味着一旦切换网站,原有的Session将失效,这无疑是糟糕的用户体验。传统PHP开发可以使用文件共享、Session存数据库以及Cookie存Session解决。但无论从性能还是安全性考虑,基于TCP协议的Memcached都具有优势,唯一的缺点就是需要保证Memcached服务器的高可靠性运行。

上一章已经介绍过PHP内置的session_set_save_handler函数,该函数用于扩展内置的Session操作,例如读取、写入、修改等,接下来将利用session_set_save_handler函数,实现将Session存放于Memcached。

首先在ThinkPHP/Extend/Driver/Session目录下创建Session驱动,并命名为SessionMemcached.class.php,代码如下所示。(www.chuimin.cn)

如上述代码所示,驱动的类名必须与驱动文件名称相同,ThinkPHP提供的初始化接口方法为execute方法,需要在初始化方法中完成session_set_save_handler函数的定义。如果使用传统的PHP,则需要在自定义初始函数或构造函数中完成。

接着定义session_set_save_handler函数所需要的6个参数,最后在当前类中分别实现参数中定义的6个方法。在自定义驱动中,可以使用MVC框架内所有对外公开的类方法及函数。保存SessionMemcached.class.php驱动文件,将Session驱动名改为SessionMemcached,如以下代码所示。

由于在驱动文件中实现了session_set_save_handler函数所有参数,所以在使用时可以直接使用PHP内置的$_SESSION获取或设置Session(需要加前缀);当然也可以使用ThinkPHP内置的Session函数(不需要加Session前缀),如以下代码所示。

通过前面的设置,现在所有Session操作(包括增加、删除、修改、销毁等)都在Memcached中完成。使用Memcached缓存Session,不仅可以提高系统性能,由于Memcached数据库是受内存限制的,一旦数据达到临界,服务器将根据时间顺序删除内存中的数据,在一定程度上减少CC等攻击。