我在PHP中使用自定义会话处理程序时遇到了一个奇怪的错误(下面的代码)。当调用session_start()时,我得到一个警告:第22行的Session :: write()缺少参数2和一个注意:未定义的变量:第25行的数据。
第22行是公共函数写入($ id,$ data),第25行是在下面使用数据变量的地方。
任何人都可以在我的代码中看到错误吗?
由于
class Session {
private $db;
private $expires_time;
public function __construct($database, $expires_time) {
$this->db = $database;
$this->expires_time = $expires_time;
}
public function open($path, $name) {
return true;
}
public function close() {
return true;
}
public function write($id, $data) {
$expires = time() + $this->expires_time;
$query = $this->db->prepare('REPLACE INTO sessions (id, data, expires) VALUES (:id, :data, :expires)');
return $query->execute(array(":id" => $id, ":data" => $data, ":expires" => $expires));
}
public function read($id) {
$query = $this->db->prepare('SELECT data FROM sessions WHERE id = :id AND expires > :expires LIMIT 1');
$query->execute(array(':id' => $id, ':expires' => time()));
if($session = $query->fetch()) {
return $session['data'];
}
return '';
}
public function destroy($id) {
$query = $this->db->prepare('DELETE FROM sessions WHERE id = :id');
return $query->execute(array(':id', $id));
}
public function clean($max) {
$query = $this->db->prepare('DELETE FROM sessions WHERE expires < :expires');
return $query->execute(array(':expires', $max));
}
}
以下代码创建对象并设置会话保存处理程序。
$sess_expires_time = 3600;
$session = new Session($_DATABASE, $sess_expires_time);
session_set_save_handler(
array($session, '_open'),
array($session, '_close'),
array($session, '_write'),
array($session, '_read'),
array($session, '_destroy'),
array($session, '_clean')
);
session_start();
答案 0 :(得分:0)
register_shutdown_function('session_write_close');
PHP已经完成了这项工作。不是你第二次写(然后引起有问题的错误)。所以删除该行。
出于调试目的,在您的开发平台上启用xdebug,您可以在其中引发错误和/或php错误配置,并将堆栈跟踪写入错误日志。应该让您了解正在发生的事情,特别是当您(通常只能在此处使用错误日志可靠地工作时,在您的保存处理程序中触发写入时,STDOUT通常会关闭)。
此外,您不在保存处理程序中执行打开/关闭跟踪。你怎么知道你应该在会议结束时写字?
此外,您的会话处理程序不处理会话名称。你应该让它更灵活,例如切换会话时如果不打算进行切换会话,你应该用一个例外来拯救,而不是你没有注意到你的会话保存处理程序类没有被忽视。
答案 1 :(得分:0)
发现问题。愚蠢的愚蠢。
我在session_set_save_handler中使用了错误的方法顺序,并且以错误的顺序调用了write和read。
感谢您的建议。