多服务器共享session及session散列存储时的创建目录代码

转载 2012年03月31日 09:15:27

from: http://apps.hi.baidu.com/share/detail/23469523

在PHP中SESSION默认是用文件来进行保存的,如session.save_path=/tmp,则是将session数据保存在/tmp目录下,如果并发用户量很大,在这个目录下就会存在大量类似sess_xxxxxx的session文件,导致性能下降,不少朋友可能都没有注意到php.ini里面Session设置部分中有这样一项:

  ; session.save_path = "N; MODE; /path"

  这项设置提供给我们可以给session存放目录进行多级散列,其中“N”表示要设置的目录级数,“MODE”表示目录的权限属性,默认为600,在WINDOWS上基本是不用设置的,*NIX上也可以不用设置,后面的“/path”表示session文件存放的根目录路径,比如我们设置为下面的格式

  session.save_path = "2; d:/php5/tmp"

  上面的设置表示我们把d:/php5/tmp目录作为php的session文件存放根目录,在该目录下进行两级目录散列,每一级目录分别是0-9和a-z共36个字母数字为目录名,这样存放session的目录可以达到36*36个,相信作为单台服务器来说,这是完全够用了,如果说您的系统架构设计为多台服务器共享session数据,可以把目录级增加到3级或者更多。

  需要注意的是,php自己并不会自动创建子目录,需要您自己动手去创建,网上找到这样的自动创建目录的代码,大家可以做个参考。下面的代码自动创建3级子目录,可以自己动手根据需要进行修改。

set_time_limit(0);
$string = '0123456789abcdefghijklmnopqrstuvwxyz';
$length = strlen($string);
function makeDir($param)
{
if(!file_exists($param)) {
makeDir(dirname($param));
mkdir($param);
}
}
for($i = 0; $i < $length; $i++) {
for($j = 0; $j < $length; $j++) {
for($k = 0; $k < $length; $k++) {
makeDir($string[$i].'/'.$string[$j].'/'.$string[$k]);
}
}
}
?>
多服务器共享session的方法:

  1.通过NFS文件共享的方式,多台WEB服务器共享保存session文件的磁盘

  2.保存在数据库中,这种方式的扩展性很强,可以随意增加WEB而不受影响

  3.可以将session数据保存在memcached中,memcached是基于内存存储数据的,性能很高,用户并发量很大的时候尤其合适,参考PHP实现多服务器session共享之memcache共享

  4.文件方式保存session时,可以采用php的扩展eaccelerator来存储sesion,参考

  eaccelerator 应用之“使用共享内存存储Session”

  首先创建表,用来保存session数据

CREATE TABLE `sessions` (              
      `sessionid` varchar(32) NOT NULL default '',    
      `data` mediumtext NOT NULL,            
      `lastvisit` int(10) unsigned NOT NULL default '0', 
      PRIMARY KEY (`sessionid`)             
     ) ENGINE=MyISAM DEFAULT CHARSET=gbk

  主要的代码如下:

  session_mysql.class.php

class session
{
var $lifetime = 1800;
  var $op = '';
  
  function __construct($op = '')
  {
    $this -> op = $op;
  session_set_save_handler(array(&$this,'open'), array(&$this,'close'), array(&$this,'read'), array(&$this,'write'), array(&$this,'destroy'), array(&$this,'gc'));
    $this->debug('session_id:' . COOKIE[session_name()]);
    //确保读写session时session id保存在同一个域下,否则有可能会每次重新生成一个session id
    ini_set('session.cookie_domain', '.chf.com');
 session_start();
  }
  
  function debug($str) {
    //echo $str . "
n";
    $file = dirname(__FILE__) . '/session.log';
    $content = date("Y-m-d H:i:s") . ' operate:' . $this -> op . ' ' . $str . "n";
    $fp = @fopen($file, "ab");
    if (!$fp) die("Open file $file failed!");
    @fwrite($fp, $content);
    if ($fp) @fclose($fp);
  }
  
  function session()
  {
 $this->__construct();
  }
  
  /**
   * 这个函数被session处理程序调用来作初始化工作。
   * @param string $save_path 参数$sess_path对应php.ini文件中的session.save_path选项
   * @param string $session_name 参数$session_name对应php.ini中的session.name 选项。
   */
  function open($save_path, $session_name)
{
    $this->debug('opening...');
 global $db;
   $this->lifetime = 20; //session超时时间
   $this->time = time();
 $this->sess = &$db;
    $this->pre = '';
 return true;
  }
  
  /*
  sess_close();
  这个函数在页面结束执行并且session处理程序需要关闭时被调用
  */
  function close()
{
    $this->debug('closing...');
 $this->gc($this->lifetime);
    return $this->sess->close();
  }
  
  //根据session id取出指定的session数据是否为空,然后判断用户登录与否或操作是否超时
  /*
  这个函数在session处理程序读取指定session键值($key)时,检索并返回标识为$key的session数据.(注意:序列化是将变量或对象在程序结束或需要时保存在文件中,在下次程序运行或需要时再调入内存的技术,有别于只保存数据的方法。)
  
  例如读session数据时会调用此函数
  $name = SESSION['name'];
  echo "name:$name";
    SESSION['name'] = 'caihf';
  
  @param string $id session id通常通过cookie来保存用户的session id,如650fcm4p8aodn1cfrusc5ehql0
  */
  function read($id)
{
    $this->debug('reading...');
    $sql = "SELECT data FROM `{$this->pre}sessions` WHERE sessionid='$id'";
 $r = $this->sess->get_one($sql);
    $this->debug("sql:$sql");
 return $r ? $r['data'] : '';
  }
  
  /*
  这个函数据在session处理程序需要将数据保存时调用,这种情况经常在程序结束时发生。它负责将数据保存在下次能用sess_read($key)函数检索的地方。
  例如给session赋值时(SESSION['name'] = 'caihf';)会调用此函数
  @param string $id session id通常通过cookie来保存用户的session id,如650fcm4p8aodn1cfrusc5ehql0
  @param string $sess_data sessoin数据,一般是自动序列化以后保存在数据库中的,如name|s:5:"caihf";
  */
  function write($id, $sess_data)
{
    $this->debug('writing...');
    $sql = "REPLACE INTO `{$this->pre}sessions` (sessionid, data, lastvisit) VALUES('$id', '".addslashes($sess_data)."', '".time()."')";
    $this->sess->query($sql);
    $this->debug("sql:$sql");
 return true;
  }
  
  /*
  这个函数在需要消毁session时。它负责删除session并且清除环境。
  @param string $id session id通常通过cookie来保存用户的session id,如650fcm4p8aodn1cfrusc5ehql0
  */
  function destroy($id)
{
    $this->debug('destroying...');
    $sql = "DELETE FROM `{$this->pre}sessions` WHERE sessionid='$id'";
 $this->sess->query($sql);
    $this->debug("sql:$sql");
 return true;
  }
  
  //删除超时的session数据
  /*
  这个函数负责清理碎片。在这种情况下,它负责删除过时的session数据。session处理程序会偶尔调用它们。
  */
  function gc($maxlifetime)
{
    $this->debug("gcing...n");
 $expiretime = $this->time-$maxlifetime;
    $sql = "DELETE FROM `{$this->pre}sessions` WHERE lastvisit<$expiretime";
 $this->sess->query($sql);
    $this->debug("sql:$sql");
 return true;
  }
}
  
/*
给session赋值时的log,如
SESSION['name'] = 'caihf';
2008-09-17 03:35:35 operate:write session_id:650fcm4p8aodn1cfrusc5ehql0
2008-09-17 03:35:35 operate:write opening...
2008-09-17 03:35:35 operate:write reading...
2008-09-17 03:35:35 operate:write sql:SELECT data FROM `sessions` WHERE sessionid='650fcm4p8aodn1cfrusc5ehql0'
2008-09-17 03:35:35 operate:write writing...
2008-09-17 03:35:35 operate:write sql:REPLACE INTO `sessions` (sessionid, data, lastvisit) VALUES('650fcm4p8aodn1cfrusc5ehql0', 'name|s:5:"caihf";', '1221622535')
2008-09-17 03:35:35 operate:write closing...
2008-09-17 03:35:35 operate:write gcing...
2008-09-17 03:35:35 operate:write sql:DELETE FROM `sessions` WHERE lastvisit<1221622515
  
从session中读数据时的log,如$name = SESSION['name'];echo "name:$name";
2008-09-17 03:44:24 operate:read session_id:650fcm4p8aodn1cfrusc5ehql0
2008-09-17 03:44:24 operate:read opening...
2008-09-17 03:44:24 operate:read reading...
2008-09-17 03:44:24 operate:read sql:SELECT data FROM `sessions` WHERE sessionid='650fcm4p8aodn1cfrusc5ehql0'
2008-09-17 03:44:24 operate:read writing...
2008-09-17 03:44:24 operate:read sql:REPLACE INTO `sessions` (sessionid, data, lastvisit) VALUES('650fcm4p8aodn1cfrusc5ehql0', 'name|s:5:"caihf";', '1221623064')
2008-09-17 03:44:24 operate:read closing...
2008-09-17 03:44:24 operate:read gcing...
2008-09-17 03:44:24 operate:read sql:DELETE FROM `sessions` WHERE lastvisit<1221623044
*/
?>


  session_test1.php

include_once('session_mysql.class.php');
include_once('db_mysql.class.php');
  
$db = new db_mysql();
$db -> connect('localhost', 'root', 'home', 'test');
$session = new session('write');
SESSION['name'] = 'caihf';
//echo "name:" . SESSION['name'] . "n";
echo 'Assign value to session over!';
?>

  session_test2.php

include_once('session_mysql.class.php');
include_once('db_mysql.class.php');
  
$db = new db_mysql();
$db -> connect('localhost', 'root', 'home', 'test');
$session = new session('read');
  
function is_login() {
  return strlen(SESSION['name']) > 0 ? 1 : 0;
}
  
if (is_login()) {
  echo "Hello {SESSION['name']}n";
} else {
  echo "User not loggined!
n";
}
//unset(SESSION['name']);
/*
执行完unset(SESSION['name']);操作,然后再刷新此页面时,字段data的值就变为空了
sessionid         data lastvisit
am1dmhbd2dsq9fpglpdh81u0d6 1221634486
*/
?>


相关文章推荐

session 在不同服务器中的共享代码

引自腾讯的人写的代码 /**  * @brief 设置session配置  */ /**  * CREATE TABLE `tbl_session` (  *     `sessio...

多Web服务器之间共享Session的解决方案

很多开发中涉及到用户的Session验证很保留的问题,这个问题比较有意思,总结了几种方案,只供参考。   [  问题提出 ]   为了满足足够大的应用,满足更多的客户,于是我们架设了N台Web...
  • ahhsxy
  • ahhsxy
  • 2012-03-02 12:54
  • 2140

PHP + Memcache 实现多服务器session共享

很多时候一个完整的系统可能运行在多个服务器上,如果这多个服务器之间需要共享session的话,那么php默认的files保存session的方式就无能为力了。这时我们可以考虑使用memcache 来接...

使用zend framework 搭建网站(七)--实现多服务器共享 SESSION 数据

使用zend framework 搭建网站(七)--实现多服务器共享 SESSION 数据 2008/12/07 08:12 P.M. 参考:肖理达 http://nio.in...

使用zend framework 搭建网站(七)--实现多服务器共享 SESSION 数据

一、问题起源          大型网站通常有多个服务器,并且使用多个二级域名。这样一台服务器产生的session就不能为所有服务器所共享。这样用户在一个地方登录就不能全部通行 (以下来自ht...

多服务器共享session的方法

伴随网站业务规模和访问量的逐步发展,原本由单台服务器、单个域名的迷你网站架构已经无法满足发展需要。 此时我们可能会购买更多服务器,并且启用多个二级子域名以频道化的方式,根据业务功能将网站分布部署...

多服务器之间session共享

session的存储了解以前是怎么做的,搞清楚了来龙去脉,才会明白进行共享背后的思想和出发点。我喜欢按照这样的方式来问(或者去搞清楚):为什么要session要进行共享,不共享会什么问题呢? 以...

PHP 实现多服务器共享 SESSION 数据

PHP 实现多服务器共享 SESSION 数据    一、问题起源   稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站 ...

PHP中多服务器共享SESSION的方法

在PHP中SESSION默认是用文件来进行保存的,如session.save_path=/tmp,则是将session数据保存在/tmp目录下,如果并发用户量很大,在这个目录下就会存在大量类似sess...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)