PHP之負載均衡下的session共用
最近忙於開發台灣運動彩券第四版的程式,所以已經很久沒有上來寫東西了,今天隨便寫點東西和大家分享.
首先說一下負載均衡,相信大家都知道負載均衡可以很好地解決網站大流量的問題,負載均衡就是把用戶的請求分發到多態pc上進行處理,既然分發了請求那麼session就要考慮好處理方法.傳統情況下php會把session存入本機的暫存檔內,可是這種情況下分發了之後session就丟失了,其實最簡單的解決方法就是用memcache來託管,單獨架設一台服務器用來作為memcache服務器(內存最好是大一點),接下來的工作就交給PHP代碼來做就好了,這裡我不想修改php.ini,因為每台都改的話太累,而且我又比較懶
或許您會告訴我說直接修改一下php.ini的session存儲位置就能寫入memcache了,是,沒錯,但是這種方式卻不能調用gc釋放掉過期的會話,而今天我們要說的就是不但要讓他託管,還得讓他自動釋放會話.
既然要做,那就要做到完美才行,下邊是我的代碼,不懂得自己看註釋:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 |
$_ENV = array ( ‘SYS‘ => array ( ‘Memip‘ => ‘127.0.0.1‘ , //MEMCACHE的ip ‘Mempt‘ =>11211, //MEMCACHE的port ‘Memtim‘ =>10, //MEMCACHE的超時時間 ) ); //託管SESSION到MEMCACHE,如果開啟失敗,則說明MEMCACHE沒有配置正確 final class
S{ public
static function open(){ //禁止session自動開啟 session_write_close(); ini_set ( ‘session.auto_start‘ ,0); //使用五十分之一的概率啟動gc清理會話 ini_set ( ‘session.gc_probability‘ ,1); ini_set ( ‘session.gc_divisor‘ ,50); ini_set ( ‘session.use_cookies‘ ,1); //session的壽命 //ini_set(‘session.gc_maxlifetime‘,$_ENV[‘SYS‘][‘Memtim‘]); //ini_set(‘session.cookie_lifetime‘,$_ENV[‘SYS‘][‘Memtim‘]); //ini_set(‘session.save_handler‘,‘files‘); //ini_set(‘session.save_path‘,Run.‘_tmp‘); //ini_set(‘session.save_handler‘,‘memcache‘); //ini_set(‘session.save_path‘,‘tcp://127.0.0.1:11211‘); //$_ENV[‘S_tim‘] = ini_get(‘session.gc_maxlifetime‘); //建立memcache對象 $_ENV [ ‘S_mem‘ ]= new
Memcache; $_ENV [ ‘S_mem‘ ]->connect( $_ENV [ ‘SYS‘ ][ ‘Memip‘ ], $_ENV [ ‘SYS‘ ][ ‘Mempt‘ ]) or
die ( ‘Memcache連接失敗!‘ ); return
TRUE; } /** 讀取 返回:讀到的內容 /**/ public
static function read( $id ){ return
$_ENV [ ‘S_mem‘ ]->get( ‘s_‘ . $id ); } /** 寫入 返回:bool /**/ public
static function write( $id , $data ){ return
$_ENV [ ‘S_mem‘ ]->set( ‘s_‘ . $id , $data ,MEMCACHE_COMPRESSED, $_ENV [ ‘SYS‘ ][ ‘Memtim‘ ]); } /** 關閉 返回:bool /**/ public
static function close(){ $_ENV [ ‘S_mem‘ ]->close(); unset( $_ENV [ ‘S_mem‘ ], $_ENV [ ‘SYS‘ ][ ‘Memtim‘ ]); return
TRUE; } /** 刪除 返回:bool /**/ public
static function destroy( $id ){ return
$_ENV [ ‘S_mem‘ ]-> delete ( ‘s_‘ . $id ); } /** 清理 返回:bool /**/ public
static function gc(){ return
TRUE; } } session_set_save_handler( ‘S::open‘ , ‘S::close‘ , ‘S::read‘ , ‘S::write‘ , ‘S::destroy‘ , ‘S::gc‘ ); $_ENV [ ‘sessionid‘ ]=(isset( $_REQUEST [ ‘sessionid‘ ])) ? trim( $_REQUEST [ "sessionid" ]) : session_id(); if ( $_ENV [ ‘sessionid‘ ]!= ‘‘ ){session_id( $_ENV [ ‘sessionid‘ ]);} session_start(); |
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。