缺少PHP自定义会话处理程序写入参数

时间:2011-10-15 23:21:00

标签: php oop session

我在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();

2 个答案:

答案 0 :(得分:0)

register_shutdown_function('session_write_close');

PHP已经完成了这项工作。不是你第二次写(然后引起有问题的错误)。所以删除该行。

出于调试目的,在您的开发平台上启用xdebug,您可以在其中引发错误和/或php错误配置,并将堆栈跟踪写入错误日志。应该让您了解正在发生的事情,特别是当您(通常只能在此处使用错误日志可靠地工作时,在您的保存处理程序中触发写入时,STDOUT通常会关闭)。

此外,您不在保存处理程序中执行打开/关闭跟踪。你怎么知道你应该在会议结束时写字?

此外,您的会话处理程序不处理会话名称。你应该让它更灵活,例如切换会话时如果不打算进行切换会话,你应该用一个例外来拯救,而不是你没有注意到你的会话保存处理程序类没有被忽视。

答案 1 :(得分:0)

发现问题。愚蠢的愚蠢。

我在session_set_save_handler中使用了错误的方法顺序,并且以错误的顺序调用了write和read。

感谢您的建议。