PHP把 session存到memcache中

企业网站用户数越来越多,同时在线人数越来越多,最大同时在线达100万之多,由于session文件是小文件存储,设想每个用户大概2K左右数据,NFS频繁读取导致IO成为瓶颈,虽然可以更改配置以分级目录的形式保持session但还是没有达到最优设计,但如果把session放在内存中,内存存取快速,就再也不用担心海量用户的压力了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
class MemSession {
private static $handler=null;
private static $lifetime=null;
/**
* 初使化和开启session
* @param Memcache $memcache memcache对象
*/
public static function start(Memcache $memcache){
//将 session.save_handler 设置为 user,而不是默认的 files
//session文件保存方式,这个是必须的!除非在Php.ini文件中设置了
ini_set('session.save_handler', 'user'); //等价于 session_module_name('user');
self::$handler=$memcache;
self::$lifetime=ini_get('session.gc_maxlifetime');
session_set_save_handler(
array(__CLASS__, 'open'),
array(__CLASS__, 'close'),
array(__CLASS__, 'read'),
array(__CLASS__, 'write'),
array(__CLASS__, 'destroy'),
array(__CLASS__, 'gc')
);
session_start();
return true;
}
public static function open($path, $name){
return true;
}
public static function close(){
return true;
}
/**
* 从SESSION中读取数据
* @param string $PHPSESSID session的ID
* @return mixed 返回session中对应的数据
*/
public static function read($PHPSESSID){
$out=self::$handler->get(self::session_key($PHPSESSID));
if($out===false || $out == null)
return '';
return $out;
}
/**
*向session中添加数据
*/
public static function write($PHPSESSID, $data){
$method=$data ? 'set' : 'replace';
return self::$handler->$method(self::session_key($PHPSESSID), $data, MEMCACHE_COMPRESSED, self::$lifetime);
}
public static function destroy($PHPSESSID){
return self::$handler->delete(self::session_key($PHPSESSID));
}
public static function gc($lifetime){
//无需额外回收,memcache有自己的过期回收机制
return true;
}
private static function session_key($PHPSESSID){
$session_key=TABPREFIX.$PHPSESSID;
return $session_key;
}
}
//使用
$mem=new Memcache();
$mem->connect('127.0.0.1', '11211');
MemSession::start($mem);
$_SESSION['myBlog']='http://www.ganktools.com';