這次給大家帶來PHP實現負載平衡下的session共用案列詳解(附代碼),PHP實現負載平衡下的session共用的注意事項有哪些,下面就是實戰案例,一起來看一下。
首先說一下負載平衡,相信大家都知道負載平衡可以很好地解決網站大流量的問題,負載平衡就是把使用者的請求分發到多態pc上進行處理,既然分發了請求那麼session就要考慮好處理方法.傳統情況下php會把session存入原生暫存檔內,可是這種情況下分發了之後session就丟失了,其實最簡單的解決方案就是用memcache來託管,單獨架設一台伺服器用來作為memcache伺服器(記憶體最好是大一點),接下來的工作就交給PHP代碼來做就好了,這裡我不想修改php.ini,因為每台都改的話太累,而且我又比較懶
或許您會告訴我說直接修改一下php.ini的session儲存位置就能寫入memcache了,是,沒錯,但是這種方式卻不能調用gc釋放掉到期的會話,而今天我們要說的就是不但要讓他託管,還得讓他自動釋放會話.
既然要做,那就要做到完美才行,下邊是My Code,不懂得自己看注釋:
$_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_pisor',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();
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
php-app開發介面加密使用步驟詳解
php curl帶有csrf-token驗證類比提交執行個體詳解