在测试时我得到了一些奇怪的结果,我似乎无法弄清楚如何使用它。我有这个自定义会话处理程序:
require_once('database.php');
Class linusLogin_Session {
private $_database;
private $_key = '*withheld*';
public function __construct() {
$this->_database = new linusLogin_Database;
session_set_save_handler(
array($this, "_open"),
array($this, "_close"),
array($this, "_read"),
array($this, "_write"),
array($this, "_destroy"),
array($this, "_gc")
);
session_name('llSSID');
session_start();
}
public function _open(){
return TRUE;
}
public function _close(){
return $this->_database->close();
}
public function _read($id){
$data = null;
$result = $this->_database->selectSessData($id);
if ($result !== FALSE) {
$result = $this->_decrypt($result);
return $result;
}
else
return "";
}
public function _write($id, $data){
$access = time();
$data = $this->_encrypt($data);
$result = $this->_database->replaceSessData($id, $access, $data);
}
public function _destroy($id){
return $this->_database->destroySessData($id);
}
public function _gc($max){
$old = time() - $max;
return $this->_database->gCollectSessData($old);
}
private function _encrypt($data) {
*encryption withheld*
return $data;
}
private function _decrypt($data) {
*decryption withheld*
return $data;
}
public function setKey($key) {
$this->_key = $key;
}
}
$session = new linusLogin_Session;
那么,我是否正确将文件实例化为自己的类(最后一行)?或者,当我使用session_start()
时,类是否会实例化?我在构造中有session_start()
,我希望它是所有文档中唯一存在的地方 - 这是一个好的做法吗?我之前遇到过这个处理程序的麻烦,因为在页面上没有使用session_start()
,即使它在处理程序中。 (我真的很讨厌那些说出来的通知
已调用
session_start()
,忽略session_start()
作为一个附带问题 - 我一直听到我应该重新生成session id
每个请求 - 但请求意味着什么?这是否意味着每个http请求或这是否意味着会话中的每个更改?重新生成id的最佳做法是什么(不使用“每个请求”行)。
此外,任何有关安全性的建议都会很棒。
答案 0 :(得分:0)
自定义会话处理程序由PHP的会话代码使用。它是一个被采取行动的对象,而不是演员。因此,您应该只定义自定义方法,然后在其他地方启动会话。
例如:
// Make sure you make changes like this one:
Class linusLogin_Session implements SessionHandlerInterface {
// This doesn't need to do anything with session config or call any session_* functions
public function __construct() {
$this->_database = new linusLogin_Database;
}
}
然后......
include "mysessionhandler.php";
$session = new linusLogin_Session();
session_set_save_handler($session);
session_name('llSSID');
session_start();
// The rest of your site goes here