PHP之負載均衡下的session共用

8/31/2015来源:PHP技巧人气:1390

php之負載均衡下的session共用

最近忙於開發台灣運動彩券第四版的程式,所以已經很久沒有上來寫東西了,今天隨便寫點東西和大家分享.

首先說一下負載均衡,相信大家都知道負載均衡可以很好地解決網站大流量的問題,負載均衡就是把用戶的請求分發到多態pc上進行處理,既然分發了請求那麼session就要考慮好處理方法.傳統情況下php會把session存入本機的暫存檔內,可是這種情況下分發了之後session就丟失了,其實最簡單的解決方法就是用memcache來託管,單獨架設一台服務器用來作為memcache服務器(內存最好是大一點),接下來的工作就交給PHP代碼來做就好了,這裡我不想修改php.ini,因為每台都改的話太累,而且我又比較懶

或許您會告訴我說直接修改一下php.ini的session存儲位置就能寫入memcache了,是,沒錯,但是這種方式卻不能調用gc釋放掉過期的會話,而今天我們要說的就是不但要讓他託管,還得讓他自動釋放會話.

既然要做,那就要做到完美才行,下邊是我的代碼,不懂得自己看註釋:

$_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();