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