php session性能,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的“肤浅”改造。

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,session性能)