自己试着写了个session_handler
但是总是失败
插入数据库的时候,sql 语句 echo出来一点问题没有,但是+----+------------+--------------+--------------+
| id | session_id | session_data | session_time |
+----+------------+--------------+--------------+
| 1 | 1198919176 | count|i:1; | 1198919176 |
+----+------------+--------------+--------------+数据库里的值居然成了这个
session_id字段和session_time居然都是一样的值谁帮我看看先行谢过[code]
<?php
/**
* ISCC_Session
*
* @author sskaje
* @version 1.0.0
* @todo session handler
* @example
* session_set_save_handler(
* array(&$this, 'open'),
* array(&$this, 'close'),
* array(&$this, 'read'),
* array(&$this, 'write'),
* array(&$this, 'destroy'),
* array(&$this, 'gc')
* );
*/
class ISCC_Session
{
public $iscclass;public function __construct()
{
}public function session_start()
{
//启用自定义handler
ini_set('session.save_handler', 'user');
session_set_save_handler(
array(&$this, 'open'), //open
array(&$this, 'close'), //close
array(&$this, 'read'), //read
array(&$this, 'write'), //write
array(&$this, 'destroy'), //destroy
array(&$this, 'gc') //gc
);
register_shutdown_function('session_write_close');
session_start();
session_regenerate_id(true);
//重新生成ID但是数据不变,并删除原有的session
}
public function open($sess_path, $sess_name)
{
return true;
}
public function close()
{
return true;
}
public function read($sess_id)
{
echo $query = "SELECT * FROM `{$this->iscclass->dbprefix}sessions` WHERE `session_id` = '{$sess_id}';";
$result = $this->iscclass->db->query($query) or die($this->iscclass->db->error);
if (!$result->num_rows)
{
$query = <<<QUERY
INSERT INTO
`{$this->iscclass->dbprefix}sessions`
SET
`session_id`='{$sess_id}',
`session_time`='{$this->iscclass->current_time_stamp}';
QUERY;
$this->iscclass->db->query($query);
return '';
}
else
{
$row = $result->fetch_assoc();
$query = <<<QUERY
UPDATE
`{$this->iscclass->dbprefix}sessions`
SET
`session_time` = '{$this->iscclass->current_time_stamp}'
WHERE
`session_id` = '{$sess_id}';"
QUERY;
$this->iscclass->db->query($query);
return $row['sess_data'];
}
}
public function write($sess_id, $data)
{
$this->iscclass->db->query("UPDATE `{$this->iscclass->dbprefix}sessions` SET `session_data` = '$data', `session_id` = {$this->iscclass->current_time_stamp} WHERE `session_id` = '{$sess_id}';");
return true;
}
/**
* session_destroy
*
* @param string $sess_id
* @return boolean
*/
public function destroy($sess_id)
{
$query = <<<QUERY
DELETE
`{$this->iscclass->dbprefix}sessions`, `{$this->iscclass->dbprefix}online`
FROM
`{$this->iscclass->dbprefix}sessions`
LEFT JOIN
`{$this->iscclass->dbprefix}online`
ON
`{$this->iscclass->dbprefix}sessions`.`session_id` = `{$this->iscclass->dbprefix}online` .`ol_sessionid`
WHERE
`session_id` = '{$sess_id}';
QUERY;
$this->iscclass->db->query($query);
return true;
}
/**
* session_gc
*
* @param int $sess_maxlifetime
* @return boolean
*/
public function gc($sess_maxlifetime)
{
$query = <<<QUERY
DELETE
`{$this->iscclass->dbprefix}sessions`, `{$this->iscclass->dbprefix}online`
FROM
`{$this->iscclass->dbprefix}sessions`
LEFT JOIN
`{$this->iscclass->dbprefix}online`
ON
`{$this->iscclass->dbprefix}sessions`.`session_id` = `{$this->iscclass->dbprefix}online` .`ol_sessionid`
WHERE
`{$this->iscclass->dbprefix}sessions`.`session_time` + {$sess_maxlifetime} < {$this->iscclass->current_time_stamp};
QUERY;
$this->iscclass->db->query($query);
return true;
}
}
/*
*/
?>
[/code]
PS:
我在read()的三个$query前都echo了下
发现,sql语句完全正确
但是
第一个select 永远没有结果,这样就进入了insert但是看了数据库之后,就发现session_id全都是session_time的值
但是总是失败
插入数据库的时候,sql 语句 echo出来一点问题没有,但是+----+------------+--------------+--------------+
| id | session_id | session_data | session_time |
+----+------------+--------------+--------------+
| 1 | 1198919176 | count|i:1; | 1198919176 |
+----+------------+--------------+--------------+数据库里的值居然成了这个
session_id字段和session_time居然都是一样的值谁帮我看看先行谢过[code]
<?php
/**
* ISCC_Session
*
* @author sskaje
* @version 1.0.0
* @todo session handler
* @example
* session_set_save_handler(
* array(&$this, 'open'),
* array(&$this, 'close'),
* array(&$this, 'read'),
* array(&$this, 'write'),
* array(&$this, 'destroy'),
* array(&$this, 'gc')
* );
*/
class ISCC_Session
{
public $iscclass;public function __construct()
{
}public function session_start()
{
//启用自定义handler
ini_set('session.save_handler', 'user');
session_set_save_handler(
array(&$this, 'open'), //open
array(&$this, 'close'), //close
array(&$this, 'read'), //read
array(&$this, 'write'), //write
array(&$this, 'destroy'), //destroy
array(&$this, 'gc') //gc
);
register_shutdown_function('session_write_close');
session_start();
session_regenerate_id(true);
//重新生成ID但是数据不变,并删除原有的session
}
public function open($sess_path, $sess_name)
{
return true;
}
public function close()
{
return true;
}
public function read($sess_id)
{
echo $query = "SELECT * FROM `{$this->iscclass->dbprefix}sessions` WHERE `session_id` = '{$sess_id}';";
$result = $this->iscclass->db->query($query) or die($this->iscclass->db->error);
if (!$result->num_rows)
{
$query = <<<QUERY
INSERT INTO
`{$this->iscclass->dbprefix}sessions`
SET
`session_id`='{$sess_id}',
`session_time`='{$this->iscclass->current_time_stamp}';
QUERY;
$this->iscclass->db->query($query);
return '';
}
else
{
$row = $result->fetch_assoc();
$query = <<<QUERY
UPDATE
`{$this->iscclass->dbprefix}sessions`
SET
`session_time` = '{$this->iscclass->current_time_stamp}'
WHERE
`session_id` = '{$sess_id}';"
QUERY;
$this->iscclass->db->query($query);
return $row['sess_data'];
}
}
public function write($sess_id, $data)
{
$this->iscclass->db->query("UPDATE `{$this->iscclass->dbprefix}sessions` SET `session_data` = '$data', `session_id` = {$this->iscclass->current_time_stamp} WHERE `session_id` = '{$sess_id}';");
return true;
}
/**
* session_destroy
*
* @param string $sess_id
* @return boolean
*/
public function destroy($sess_id)
{
$query = <<<QUERY
DELETE
`{$this->iscclass->dbprefix}sessions`, `{$this->iscclass->dbprefix}online`
FROM
`{$this->iscclass->dbprefix}sessions`
LEFT JOIN
`{$this->iscclass->dbprefix}online`
ON
`{$this->iscclass->dbprefix}sessions`.`session_id` = `{$this->iscclass->dbprefix}online` .`ol_sessionid`
WHERE
`session_id` = '{$sess_id}';
QUERY;
$this->iscclass->db->query($query);
return true;
}
/**
* session_gc
*
* @param int $sess_maxlifetime
* @return boolean
*/
public function gc($sess_maxlifetime)
{
$query = <<<QUERY
DELETE
`{$this->iscclass->dbprefix}sessions`, `{$this->iscclass->dbprefix}online`
FROM
`{$this->iscclass->dbprefix}sessions`
LEFT JOIN
`{$this->iscclass->dbprefix}online`
ON
`{$this->iscclass->dbprefix}sessions`.`session_id` = `{$this->iscclass->dbprefix}online` .`ol_sessionid`
WHERE
`{$this->iscclass->dbprefix}sessions`.`session_time` + {$sess_maxlifetime} < {$this->iscclass->current_time_stamp};
QUERY;
$this->iscclass->db->query($query);
return true;
}
}
/*
*/
?>
[/code]
PS:
我在read()的三个$query前都echo了下
发现,sql语句完全正确
但是
第一个select 永远没有结果,这样就进入了insert但是看了数据库之后,就发现session_id全都是session_time的值
/**
* ISCC_Session
*
* @author sskaje
* @version 1.0.0
* @todo session handler
* @example
* session_set_save_handler(
* array(&$this, 'open'),
* array(&$this, 'close'),
* array(&$this, 'read'),
* array(&$this, 'write'),
* array(&$this, 'destroy'),
* array(&$this, 'gc')
* );
*/
class ISCC_Session
{
public $iscclass;public function __construct()
{
}public function session_start()
{
//启用自定义handler
ini_set('session.save_handler', 'user');
session_set_save_handler(
array(&$this, 'open'), //open
array(&$this, 'close'), //close
array(&$this, 'read'), //read
array(&$this, 'write'), //write
array(&$this, 'destroy'), //destroy
array(&$this, 'gc') //gc
);
register_shutdown_function('session_write_close');
session_start();
session_regenerate_id(true);
//重新生成ID但是数据不变,并删除原有的session
}
public function open($sess_path, $sess_name)
{
return true;
}
public function close()
{
return true;
}
public function read($sess_id)
{
echo $query = "SELECT * FROM `{$this->iscclass->dbprefix}sessions` WHERE `session_id` = '{$sess_id}';";
$result = $this->iscclass->db->query($query) or die($this->iscclass->db->error);
if (!$result->num_rows)
{
$query = <<<QUERY
INSERT INTO
`{$this->iscclass->dbprefix}sessions`
SET
`session_id`='{$sess_id}',
`session_time`='{$this->iscclass->current_time_stamp}';
QUERY;
$this->iscclass->db->query($query);
return '';
}
else
{
$row = $result->fetch_assoc();
$query = <<<QUERY
UPDATE
`{$this->iscclass->dbprefix}sessions`
SET
`session_time` = '{$this->iscclass->current_time_stamp}'
WHERE
`session_id` = '{$sess_id}';"
QUERY;
$this->iscclass->db->query($query);
return $row['sess_data'];
}
}
public function write($sess_id, $data)
{
$this->iscclass->db->query("UPDATE `{$this->iscclass->dbprefix}sessions` SET `session_data` = '$data', `session_id` = {$this->iscclass->current_time_stamp} WHERE `session_id` = '{$sess_id}';");
return true;
}
/**
* session_destroy
*
* @param string $sess_id
* @return boolean
*/
public function destroy($sess_id)
{
$query = <<<QUERY
DELETE
`{$this->iscclass->dbprefix}sessions`, `{$this->iscclass->dbprefix}online`
FROM
`{$this->iscclass->dbprefix}sessions`
LEFT JOIN
`{$this->iscclass->dbprefix}online`
ON
`{$this->iscclass->dbprefix}sessions`.`session_id` = `{$this->iscclass->dbprefix}online` .`ol_sessionid`
WHERE
`session_id` = '{$sess_id}';
QUERY;
$this->iscclass->db->query($query);
return true;
}
/**
* session_gc
*
* @param int $sess_maxlifetime
* @return boolean
*/
public function gc($sess_maxlifetime)
{
$query = <<<QUERY
DELETE
`{$this->iscclass->dbprefix}sessions`, `{$this->iscclass->dbprefix}online`
FROM
`{$this->iscclass->dbprefix}sessions`
LEFT JOIN
`{$this->iscclass->dbprefix}online`
ON
`{$this->iscclass->dbprefix}sessions`.`session_id` = `{$this->iscclass->dbprefix}online` .`ol_sessionid`
WHERE
`{$this->iscclass->dbprefix}sessions`.`session_time` + {$sess_maxlifetime} < {$this->iscclass->current_time_stamp};
QUERY;
$this->iscclass->db->query($query);
return true;
}
}
/*
*/
?>
发现在这个cgi的环境下插入数据库的内容是正确的,但是,加在httpd下还是不行
看我的Blog.
有数据库和memcache两种方式的实现代码.
一步一步,一点问题都没有但是,直接用httpd肯定不行后来在调试的时候,直接测试step over,发现,只要稍微快一点,session id 全都成了 time()
大概弄个一秒多的时差,数据就正常XD