Recently I have been busy developing the program for the fourth edition of Taiwan Sports Lottery, so I haven’t written anything for a long time. Today I just wrote something to share with you.
First let’s talk about load balancing. I believe everyone knows that load balancing can solve the problem of large website traffic. Load balancing is to distribute user requests to polymorphic PCs for processing. Since the request is distributed, the session needs to be Consider the processing method. Traditionally, PHP will store the session in the local temporary file. However, in this case, the session will be lost after distribution. In fact, the simplest solution is to use memcache to host it and set up a separate server. The server is used as a memcache server (it is best to have a larger memory), and the next work is left to the PHP code. I don’t want to modify php.ini here, because it would be too tiring to change it for each server, and I Lazy
Maybe you will tell me that you can write to memcache by directly modifying the session storage location of php.ini. Yes, that’s right, but this method cannot call gc to release the expired session, and today we are going to say The key is not only to allow it to be hosted, but also to allow it to automatically release the session.
Since you want to do it, you have to do it perfectly. Below is my code. If you don’t know how to read the comments yourself:
$_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();