php性能研究--session(一)

原创 2004年07月22日 19:40:00

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的存储.当然还有改造的余地.

研究性学习的MOOR平台--关键是对接了综评以及资料共享

研究型课程建设落实面向全体学生的研究性学习?如何通过规范档案和专业平台来记录学生的研究性学习经历?如何做好初高中研究型课程目标体系的衔接?这是我区中学研究型课程建设中亟待解决的问题。活动第二个议程是市...
  • gnicky
  • gnicky
  • 2017年02月09日 18:02
  • 4549

springmvc研究(网上看到的,觉得挺不错)

一、前言: 大家好,Spring3 MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了。Spring3 MVC结构简单,应了那句话简单就是...
  • opening_world
  • opening_world
  • 2014年05月12日 18:02
  • 5355

2016年全国管理类硕士研究生考试——综合能力复习心得

博客地址:http://blog.csdn.net/shelleyliu0415 9年前与4名复习考研的小伙伴们一起奋战半年,很遗憾最终无缘于研究生的学习殿堂,没想到9年后的今天,我独自...
  • ShelleyLiu0415
  • ShelleyLiu0415
  • 2016年02月16日 16:33
  • 1807

关于php和javascript中共用cookie与session的研究

最近一直忙着各种考试,jQuery的文章还只写了一半,不过既然碰到了这个问题那就先写出来记录下,从今天晚上开始应该可以继续学jQuery了。。。。 关于cookie和session的机制就不...
  • BeyondQqiang
  • BeyondQqiang
  • 2013年06月03日 18:11
  • 961

PHP调用session_start后页面始终加载的问题研究

一个PHP页面的执行时间比较长(15秒左右),而只要这个页面没有执行完毕,其他的页面访问都是长时间加载状态,只有那个页面执行完毕了,剩下的页面才能打开。 这是什么情况呢,经过查看,两个页面都设计...
  • Delete_V
  • Delete_V
  • 2013年11月24日 19:53
  • 839

PHP为什么这么火爆-性能研究

关于PHP,很多人的直观感觉是PHP是一种灵活的脚本语言,库类丰富,使用简单,安全,非常适合WEB开发,但性能低下。PHP的性能是否真的就如同大家的感觉一样的差呢?本文就是围绕这么一个话题来进行探讨的...
  • huangleijay
  • huangleijay
  • 2013年09月11日 15:56
  • 450

Session每次都失效的工程(含源码,供研究)

  • 2012年01月12日 08:54
  • 7.87MB
  • 下载

PHP5 session 详解

  • 2016年01月13日 11:48
  • 95KB
  • 下载

PHP创建和使用session cookie变量

  • 2011年11月17日 17:14
  • 2KB
  • 下载

PHP自定义session存储(mysql数据库)

  • 2009年07月28日 15:21
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:php性能研究--session(一)
举报原因:
原因补充:

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