causky的专栏

qq:14902134|多多交流啊

php性能研究--session(一)

session的意思是对话。关于session是如何使用cookies的,这里就不多说了。我们着重讨论一下PHP的session机制。

1。SESSION的操作

php在session_start的时候会检验该次对话是否有session的存在,如果没有就建立。

session_register的时候会对session做一次修改。每次给session赋值的时候也会做一次修改。

同理取消某个session值的时候也会修改。

2。SESSION的存储

通用的SESSION有2种存储方式。文件和数据库。

不管使用文件/数据库。SESSION的这种频繁操作都会造成系统的I/O负载加重。

文件和数据库的比较:

数据库的存储比较方便,管理起来也是这样。而且能支持多台SERVER共享SESSION。但效率非常低。

文件存储速度很快,经过测试,使用3层的session目录结构是最佳方式。但弱点就是session共享不方便。

3。对session的“肤浅”改造。

减少对session的频繁操作。可以将需要的session做一个值,放入session中存放。

比如$_SESSION['id'] = 12345; $_SESSION['name'] = 'abcd';

我们完全可以组合成:$_SESSION['MYSESSSION'] = 'id:5:12345|name:4:abcd|'的形式存放。这样极大的减少了I/O负载。

4。对session的深层改造。

初步设想,修改session模块,进一步减少SESSION的操作频繁度,进行session文件的可控制性。加强使用文件session同时,多台SERVER的共享性。减少使用文件数据库存储session时,对数据库连接的频繁性(长连接?)

2004-07-23补充一下对session的“肤浅”改造。

<?php
class MySession
{
 var $G_DT_SEESION = false;
 var $mysess   = array();
 var $sestr   = '';
 var $errno   = 0;
 var $register  = false;

 function MySession()
 {
  if (!$this->G_DT_SEESION)
  {
   if(!session_start())
   {
    $this->_set_errno(103);
    return false;
   }
   $this->G_DT_SEESION = true;
   
   if (isset($_SESSION['MYWEBSESSION']))
   {
    $this->register = true;
    $this->sestr = $_SESSION['MYWEBSESSION'];
   }
   else
   {
    session_register('MYWEBSESSION');
   }
  }
  
  if($this->register)
  {
   $this->_split_sess();
  }
 }
 
 function _set_errno($no)
 {
  $this->errno = $no;
 }
 
 function set_val($k,$v)
 {
  if ($this->errno)
   return false;
  
  $this->mysess[$k] = $v;

 }
 
 function get_val($k)
 {
  return $this->mysess[$k];
 }

 function _split_sess()
 {
  $c = strlen($this->sestr);
  $flag = 0;
  for ($i = 0, $v = 1, $x = 0; $i < $c; $i++)
  {
   switch ($v)
   {
    case 2:
     if ($this->sestr{$i} == ':')
     {
      $vallen  = 0;
      $vallen += substr($this->sestr, $i - $x, $x);
      if ($vallen > 0)
      {
       $i++;
       $valstr  = substr($this->sestr, $i, $vallen);
       $i += $vallen - 1;
      }
      else
      {
       $valstr  = '';
      }
      $this->mysess[$keystr] = $valstr;
      $x = 0;
      $v = 0;
      $flag++;
     }
     else
     {
      $x++;
     }
     break;
    case 1:
     if ($this->sestr{$i} == ':')
     {
      $keystr = substr($this->sestr, $i - $x, $x);
      $x = 0;
      $v++;
     }
     else
     {
      $x++;
     }
     break;
    case 0:
    default:
     if ($this->sestr{$i} == '|')
     {
      $x = 0;
      $v++;
     }
     break;
   }
   if ($this->sestr{$i} == "/n")
   {
    break;
   }
  }
 }
 
 function is_ok()
 {
  return !$this->errno;
 }

 function my_dump()
 {
  if ($this->errno)
   return false;
  foreach($this->mysess as $k => $v)
  {
   $str .= $k . ':' . strlen($v) . ':' . $v . '|';
  }
  $_SESSION['MYWEBSESSION'] = $str;
 }
 
 function get_session_id()
 {
  return session_id();
 }
 
 function my_session_unregister($k)
 {
  session_unregister($k);
 }
 function my_session_unset()
 {
  session_unset();
 }
 
 function err_msg()
 {
  switch ($this->errno)
  {
   case 103:
    return 'session start error';
   default:
    return;
  }
 }
}

$cc = new MySession();
$cc->set_val('aaa','1111');
$cc->set_val('bbb','222');
$cc->my_dump();
echo $cc->get_session_id()."
";
/*
echo $cc->get_val('aaa');
echo $cc->get_val('bbb');
*/
echo session_save_path();
?>

适用于多session的存储.当然还有改造的余地.

阅读更多
个人分类: php
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭