MEMCACHE共享SESSION

发布于:2014-1-10 11:42 作者:admin 浏览:2119 分类:系统架构
1. 实验环境(2个机器)
192.168.1.10(Memcached服务器)
192.168.1.20(WEB服务器)
2.配置Memcached服务器(192.168.1.10)
安装: yum install memcached
开启: memcached -d -m 32 -p 11211 -u root (开启11211端口提供服务,32M缓存,最好不要带-l 如 -l 127.0.0.1,否则会导致远程服务器连接不上)
3.在WEB机器上编写测试程序(192.168.1.20. 注意:一定要安装memcache扩展)
<?php
header("Content-type:text/html; charset=utf-8");
echo "<pre>";
$mamcache_server_ip='192.168.1.10';
$mamcache_server_port='11211';

//设置MemcacheSession共享
ini_set("session.save_handler","memcache");
ini_set("session.save_path","tcp://$mamcache_server_ip:$mamcache_server_port");
session_start();


//session赋值
$session_id=session_id();
var_dump("session_id=".$session_id);


$action=$_GET['action'];
switch($action)
{
	
	
	//清除$_SESSION['mem_session']
	case 'clear':
	unset($_SESSION['mem_session']);
	var_dump($_SESSION['mem_session']);
	//session_destroy();
	break;
	
	//存储SESSION
	case 'set':
	$_SESSION['mem_session']='测试SESSION='.date("Y-m-d H:i:s"); 
	var_dump($_SESSION['mem_session']);
	break;
	
	//获取SESSION
	case 'get':
	var_dump($_SESSION['mem_session']);
	break;
	
	
	//查看Memcahce如何存储的SESSION
	case 'mem':
	//从MEMCACHE读取SESSION的值。
	$memcache = new Memcache;
	$memcache->connect($mamcache_server_ip,$mamcache_server_port) or die ("连接服务器失败");
	
	//key 来源 session_id();
	$result = $memcache->get($session_id);
	var_dump("结果=".$result);
	break;
}

echo "</pre>";
?>
4. 测试结果如下:
4.1. http://localhost/session.php?action=clear
string(37) "session_id=o8lb038n05c6e185d0c882kp84"
NULL
4.2. http://localhost/session.php?action=set
string(37) "session_id=o8lb038n05c6e185d0c882kp84"
string(33) "测试SESSION=2014-01-10 05:32:46"


4.3.http://localhost/session.php?action=get
string(37) "session_id=o8lb038n05c6e185d0c882kp84"
string(33) "测试SESSION=2014-01-10 05:32:46"



4.4.http://localhost/session.php?action=mem


string(37) "session_id=o8lb038n05c6e185d0c882kp84"
string(60) "结果=mem_session|s:33:"测试SESSION=2014-01-10 05:32:46";"

标签: session memcache

0

设置session用memcache来存储

发布于:2014-1-9 16:42 作者:admin 浏览:1668 分类:系统架构
设置session用memcache来存储 

方法I: 在 php.ini 中全局设置 
Php.ini代码  
  1. session.save_handler = memcache  
  2. session.save_path = "tcp://127.0.0.1:11211"  


方法II: 某个目录下的 .htaccess 
 
  1. php_value session.save_handler "memcache"  
  2. php_value session.save_path  "tcp://127.0.0.1:11211"  


方法III: 再或者在某个一个应用中 
Php代码  
  1. ini_set("session.save_handler""memcache");  
  2. ini_set("session.save_path""tcp://127.0.0.1:11211");  


使用多个 memcached server 时用逗号","隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等等,类似这样的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。 

如果安装的PECL是memcached(依赖libmemcached库的那个扩展),则配置应为 
Php代码  
  1. ini_set("session.save_handler""memcached"); // 是memcached不是memcache  
  2. ini_set("session.save_path""127.0.0.1:11211"); // 不要tcp:[/b]  


代码例子(不依赖libmemcached库的那个) 
Php代码  
  1. <?php  
  2. session_start();  
  3. if (!isset($_SESSION['TEST'])) {  
  4.     $_SESSION['TEST'] = time();  
  5. }  
  6.    
  7. $_SESSION['TEST3'] = time();  
  8.    
  9. print $_SESSION['TEST'];  
  10. print "<br><br>";  
  11. print $_SESSION['TEST3'];  
  12. print "<br><br>";  
  13. print session_id();  
  14. ?>  


用 sessionid 去 memcached 里查询一下: 
Php代码  
  1. <?php  
  2. $memcache = memcache_connect('localhost', 11211);  
  3. var_dump($memcache->get('19216821213c65cedec65b0883238c278eeb573e077'));  
  4. ?>  

 

 

标签: session memcache

0

PHP共享SESSION之NFS篇

发布于:2014-1-9 15:50 作者:admin 浏览:2295 分类:系统架构
1.环境3台机器
192.168.1.10(负载均衡机器)
192.168.1.11(NFS服务器)

192.168.1.20(WEB服务器1)
192.168.1.30(WEB服务器2)



2. 负载均衡机器配置
http
{
    upstream  test{
	server   192.168.1.20:80 weight=2;
	server   192.168.1.30:80;
	server   192.168.1.50:80 backup;
    }

    location / {
	proxy_pass         http://test;
	proxy_set_header   Host             $host;
	proxy_set_header   X-Real-IP        $remote_addr;
	proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
     }

}

3. NFS服务器配置
   vi /etc/exports
   /var/www/session/ 192.168.1.*(rw,no_root_squash)   //设置共享目录

 
4. 配置WEB1服务器
4.1 挂载NFS目录 
   mount -t nfs 192.168.1.11:/var/www/session/ /mnt/session/

4.2 编写session测试程序。(Session赋值)
   vi /var/www/html/session.php
   <?php
   session_start(); //开始记录SESSION。
   session_save_path('/mnt/session/');  //设置SESSION存储路径为NFS方式
      
   echo "SessionID=".session_id()."<br>";  //输出SessionID
   $_SESSION['myip']='192.168.1.20';       //设置Sesssion值
   var_dump($_SESSION);                    //输出Sesssion值
   ?>

5. 配置WEB2服务器
5.1 挂载NFS目录 
   mount -t nfs 192.168.1.11:/var/www/session/ /mnt/session/

5.2 编写session测试程序。(仅仅用来读数据)
   vi /var/www/html/session.php
   <?php
   session_start(); //开始记录SESSION。
   session_save_path('/mnt/session/');  //设置SESSION存储路径为NFS方式
      
   echo "SessionID=".session_id()."<br>";  //输出SessionID
   var_dump($_SESSION);                    //输出Sesssion值
   ?>


6. 注意权限问题(nginx可写可读)
    chown -R nginx:nginx /mnt/session/
    chmod 0777 -R  /mnt/session/


7. 测试成果.
7.1 不共享SESSION方案
    在测试代码中 //session_save_path('/mnt/session/');  表示不共享SESSION。
    测试结果:
    WEB1服务器结果:SessionID=cb3cud0jv5m2949ljapib2sgo3    array(1) { ["myip"]=> string(12) "192.168.1.20" } 
    WEB2服务器结果:SessionID=cb3cud0jv5m2949ljapib2sgo3    array(1) {} 

7.2 共享SESSION方案
    session_save_path('/mnt/session/'); 表示共享SESSION,把两个服务器的SESSION都激励在NFS服务器上。
   测试结果:
   WEB1服务器结果:SessionID=cb3cud0jv5m2949ljapib2sgo3    array(1) { ["myip"]=> string(12) "192.168.1.20" } 
   WEB2服务器结果:SessionID=cb3cud0jv5m2949ljapib2sgo3    array(1) { ["myip"]=> string(12) "192.168.1.20" } 

7.3 测试总结: 采用方案2,即可实现集群共享SESSION。

标签: nfs session

0

PHP的SESSION机制

发布于:2014-1-9 9:11 作者:admin 浏览:1829 分类:PHP
1.session.save_handler = files

1. session_start()
1. session_start()是session机制的开始,它有一定概率开启垃圾回收,因为session是存放在文件中,
PHP自身的垃圾回收是无效的,SESSION的回收是要删文件的,这个概率是根据php.ini的配置决定的,
但是有的系统是 session.gc_probability = 0,这也就是说概率是0,而是通过cron脚本来实现垃圾回收。

session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440//过期时间 默认24分钟
//概率是 session.gc_probability/session.gc_divisor 结果 1/1000, 
//不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的。
session.save_path = //好像不同的系统默认不一样,有一种设置是 "N;/path"
//这是随机分级存储,这个样的话,垃圾回收将不起作用,需要自己写脚本

 2. session会判断当前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE键值,
这个值可以从php.ini找到

session.name = PHPSESSID //默认值PHPSESSID
     

 3. 如果不存在会生成一个session_id,然后把生成的session_id作为COOKIE的值传递到客户端.
相当于执行了下面COOKIE 操作,注意的是,这一步执行了setcookie()操作,COOKIE是在header头中发送的,
这之前是不能有输出的,PHP有另外一个函数 session_regenerate_id() 如果使用这个函数,这之前也是不能有输出的。

setcookie(session_name(),
	  session_id(),
	  session.cookie_lifetime,//默认0
	  session.cookie_path,//默认'/'当前程序跟目录下都有效
	  session.cookie_domain,//默认为空
)

 4. 如果存在那么session_id = $_COOKIE[session_name];
然后去session.save_path指定的文件夹里去找名字为'SESS_' . session_id()的文件.
读取文件的内容反序列化,然后放到$_SESSION中


* 2. 为$_SESSION赋值
比如新添加一个值$_SESSION['test'] = 'blah'; 那么这个$_SESSION只会维护在内存中,当脚本执行结束的时候,
用把$_SESSION的值写入到session_id指定的文件夹中,然后关闭相关资源.      这个阶段有可能执行更改session_id的操作,
比如销毁一个旧的的session_id,生成一个全新的session_id.一半用在自定义 session操作,角色的转换上,
比如Drupal.Drupal的匿名用户有一个SESSION的,当它登录后需要换用新的session_id

if (isset($_COOKIE[session_name()])) 
{
	setcookie(session_name(), '', time() - 42000, '/');//旧session cookie过期
}
session_regenerate_id();//这一步会生成新的session_id
//session_id()返回的是新的值

3.写入SESSION操作
在脚本结束的时候会执行SESSION写入操作,把$_SESSION中值写入到session_id命名的文件中,可能已经存在,
可能需要创建新的文件。




4. 销毁SESSION
SESSION发出去的COOKIE一般属于即时COOKIE,保存在内存中,当浏览器关闭后,才会过期,假如需要人为强制过期,
比如 退出登录,而不是关闭浏览器,那么就需要在代码里销毁SESSION,方法有很多,
4.1. setcookie(session_name(), session_id(), time() - 8000000, ..);//退出登录前执行
4.2. usset($_SESSION);//这会删除所有的$_SESSION数据,刷新后,有COOKIE传过来,但是没有数据。
4.3. session_destroy();//这个作用更彻底,删除$_SESSION 删除session文件,和session_id




2.session.save_handler = user

用户自定义session处理机制,更加直观
* session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc'); 
1.session_start(),
执行open($save_path, $session_name)打开session操作句柄
$save_path 在session.save_handler = files的情况下它就是session.save_path,
但是如果用户自定的话,这个两个参数都用不上,直接返回TRUE

执行read($id)从中读取数据.//这个参数是自动传递的就是session_id(),可以通过这个值进行操作。

* 2.脚本执行结束
执行write($id, $sess_data) //两个参数,很简单

* 3.假如用户需要session_destroy()
先执行destroy.在执行第2步

一个实际例子:

//SESSION初始化的时候调用
function open($save_path, $session_name)
{
	global $sess_save_path;
	$sess_save_path = $save_path;
	return(true);
}

//关闭的时候调用
function close()
{
	return(true);
}

function read($id)
{
	global $sess_save_path;
	$sess_file = "$sess_save_path/sess_$id";
	return (string) @file_get_contents($sess_file);
}
//脚本执行结束之前,执行写入操作
function write($id, $sess_data)
{
	echo "sdfsf";
	global $sess_save_path;

	$sess_file = "$sess_save_path/sess_$id";
	if ($fp = @fopen($sess_file, "w")) 
	{
		$return = fwrite($fp, $sess_data);
		fclose($fp);
		return $return;
	} 
	else 
	{
		return(false);
	}

}

function destroy($id)
{
	global $sess_save_path;

	$sess_file = "$sess_save_path/sess_$id";
	return(@unlink($sess_file));
}

function gc($maxlifetime)
{
	global $sess_save_path;

	foreach (glob("$sess_save_path/sess_*") as $filename) 
	{
	  if (filemtime($filename) + $maxlifetime < time()) 
	  {
	    @unlink($filename);
	  }
	}
	return true;
}

标签: session

0

php memcache集群中的session

发布于:2014-1-9 8:56 作者:admin 浏览:2819 分类:系统架构

传统的session是以文件形式存储于服务器端的,但是当处于集群环境时,客户端访问的可能是任意服务器中的一台,也就是说不一定此时session文件就存在于此台服务器上,自然也就访问不到session了。

过去的解决办法一般是通过数据库来存储session的方式来解决,这样就可以实现跨服务器的session共享了,但与之而来的问题就是对数据库频繁访问所造成的问题了。

所以我们要用memcache来解决这个问题!

1.首先安装memcache,以及memcache在php中的扩展

2.修改php.ini文件

session.save_handler = memcache
session.save_path = “tcp://127.0.0.1:11211″

或者memcached

session.save_handler = memcached

session.save_path = "127.0.0.1:11211"


或者在php代码里面实现

ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', 'tcp://192.168.0.1:10001?persistent=1&weight=1&timeout=1&retry_interval=15,tcp://192.168.0.2:10002?persistent=1&weight=1&timeout=1&retry_interval=15');

session_start();

使用多个 memcached server 时用逗号”,”隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数”persistent”、”weight”、”timeout”、”retry_interval” 等等,类似这样的:”tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2″ 。

3.大功告成,重启apache和memcache看看phpinfo里的session配置是不是变成了memcache了。


memcache 集群不用怎么设置直接用:

  addServer($ip,$port);
  addServer($ip,$port);

  addServer($ip,$port);


memcached 集群不用怎么设置直接用:

  $m = new Memcached();
  $servers = array(
      array(
'mem1.domain.com'1121133),
      array(
'mem2.domain.com'1121167)
  );
  $m->addServers($servers);


demo 页面一

<?php

session_start();


$_SESSION['TEST'] = time();

$_SESSION['TEST2'] = 'test2';


echo session_id();


$mem = new Memcache();

$mem->addServer('127.0.0.1',11211);

$mem->addServer('localhost',11211);


echo '<hr>';

print_r($mem->get(session_id()));

?>


<a href="./memcache-session2.php" target="_balnk">页面2</a>


demo 页面二

<?php

session_start();

print_r($_SESSION);


结果:正确


注:memcached 方式

ini_set("session.save_handler", "memcached"); // 是memcached不是memcache

ini_set("session.save_path", "127.0.0.1:11211"); // 不要tcp:

 

 

 

 

1.在session的存储服务器上安装 redis 

2,修改php.ini配置

 
  1. session.save_handler = redis  
  2. session.save_path = "tcp://127.0.0.1:6379"  

3,查看redis的php扩展

 

四,session存储到redis中测试

 
  1. <?php  
  2. session_start();  
  3. $_SESSION['redis'] = "aaaaaa";  
  4. echo session_id();  
  5. echo "<br>";  
  6. echo $_SESSION['redis'];  
  7. echo "<br>";  
  8. $redis = new redis();  
  9. $redis->connect('127.0.0.1', 6379);  
  10. echo $redis->get("PHPREDIS_SESSION:".session_id()); 
  11. ?>  
 

标签: session memcache

0

SESSION集群

发布于:2014-1-9 8:13 作者:admin 浏览:1538 分类:系统架构

1. 客户端cookie加密
   优点:简单,高效。比较好的方法是自己采用cookie机制来实现一个session,在应用中使用此session实现。客户端解决方法.把session加密后存在cookie中,每次session信息被写在客服端,然后经浏览器再次提交到服务器.即使两次请求在集群中的两台服务器上完成,也可以到达session共享.这种解决方法的优点是session信息不用存放在服务器端,大大减轻了服务器的压力.另一个优点是一个session中的两次或多次请求可以在一个群集中的多个服务器上完成,可以避免单端故障..
   缺点:缺点是由于受http协议头信心长度的限制,仅能够存储小部分的用户信息,同时Cookie化的 Session内容需要进行安全加解密(如:采用DES、RSA等进行明文加解密;再由MD5、SHA-1等算法进行防伪认证),另外它也会占用一定的带宽资源,因为浏览器会在请求当前域名下任何资源时将本地Cookie附加在http头中传递到服务器。  


2. 使用共享存储来保存session
   优点:使用nfs或windows文件共享都可以,或者专用的共享存储设备。
   缺点:因为是网络磁盘,访问量大的时候IO存在瓶颈。共享存储是一个单点,这个可以通过raid来解决。


3. 使用数据库保存session
   优点:使用数据库来保存session,就算服务器宕机了也没事,session照样在。
   缺点:每次请求都进行数据库读写开销不小(使用内存数据库可以提高性能,宕机就会丢失数据。可供选择的内存数据库有BerkeleyDB,Mysql的内存表);


4. 使用memcached来保存session
   优点:这种方式跟数据库类似,不过因为是内存存取的,性能自然要比数据库好多了。
   缺点:memcached服务器一死,所有session全丢。

5. 使用redis来保存session
    优点:这种方式跟数据库类似,不过因为是内存存取的,性能自然要比数据库好多了。因为redis有数据持久化功能,避免了用户其他内存方式服务器死掉,数据全部丢失的问题。完美。


6.使用硬件的方式保存session
  优点: 如F5,支持session共享,且处理速度快。

  缺点:不灵活,硬件贵。

 

7. session群集
  优点:提供一个群集保存session共享信息.其他应用统统把自己的session信息存放到session群集服务器组.当应用系统需要session信息的时候直接到session群集服务器上读取.


8. session复制方案
   优点:让用户的一个session在一个服务器完成.定时的备份session信息到salve上面.一台服务器down掉后,通过均衡服务器透明把用户的请求转发到群集中的其他服务器上,此时需要从salve上读取备份的session信息.  避免单点。
  

 

标签: session 集群

0