PHP实现负载均衡下的session共用功能


Posted in PHP onApril 17, 2018

本文实例讲述了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的超?r?r?
  )
);
//托管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;
  }
  /**
    ?h除
    返回: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 相关文章推荐
用PHP函数解决SQL injection
Oct 09 PHP
我的论坛源代码(七)
Oct 09 PHP
利用PHP制作简单的内容采集器的代码
Nov 28 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
Aug 16 PHP
PHP中防止SQL注入方法详解
Dec 25 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
Oct 22 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
Jun 13 PHP
Symfony2针对输入时间进行查询的方法分析
Jun 28 PHP
PHP实现登录注册之BootStrap表单功能
Sep 03 PHP
PHP设计模式之模板模式定义与用法详解
Dec 20 PHP
Laravel 创建指定表 migrate的例子
Oct 09 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 PHP
PHP代码重构方法漫谈
Apr 17 #PHP
php微信公众号开发之现金红包
Apr 16 #PHP
PHP闭包定义与使用简单示例
Apr 13 #PHP
PHP简单实现正则匹配省市区的方法
Apr 13 #PHP
PHP编程实现的TCP服务端和客户端功能示例
Apr 13 #PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 #PHP
php 字符串中是否包含指定字符串的多种方法
Apr 12 #PHP
You might like
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
2011/05/09 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
详解php设置session(过期、失效、有效期)
2015/11/12 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
2019/06/12 PHP
Swoole扩展的6种模式深入详解
2021/03/04 PHP
一个javascript参数的小问题
2008/03/02 Javascript
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
jqGrid读取选择的多行的某个属性代码
2014/05/18 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
Knockout自定义绑定创建方法
2015/12/26 Javascript
jQuery表单验证插件解析(推荐)
2016/07/21 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
2019/01/18 jQuery
小程序显示弹窗时禁止下层的内容滚动实现方法
2019/03/20 Javascript
jquery多级树形下拉菜单的实例代码
2019/07/09 jQuery
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
Vuex实现数据共享的方法
2019/12/20 Javascript
如何通过vscode运行调试javascript代码
2020/07/24 Javascript
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
python 切片和range()用法说明
2013/03/24 Python
Python守护进程用法实例分析
2015/06/04 Python
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
Python 内置函数globals()和locals()对比详解
2019/12/23 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
毕业生就业自荐书
2013/12/15 职场文书
大学生实习证明
2015/06/16 职场文书
CAD实训总结范文
2015/08/03 职场文书