• 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();
    
  • 相关阅读:
    click事件——背景高亮
    color——RGB转16进制
    导航栏高亮设置
    layui table 渲染完成后,怎样拿到表个里的所有数据
    解决 AttributeError: 'dict' object has no attribute 'has_key' 错误的方法
    2019年总结:醒悟还为时不晚
    Worker Services读取配置后,发布Windows出现的问题及解决
    C# 读取配置(详细操作,让我们一起共同成长)
    程序不包含适合于入口点的静态“Main”方法
    .NET Core3.0-Worker Services
  • 原文地址:https://www.cnblogs.com/see7di/p/3560329.html
Copyright © 2020-2023  润新知