我不确定这里有什么问题,但我已经尝试了一切解决一个非常烦人的问题,这个问题一直困扰着我的网站,那就是PHP为每个用户生成多个会话。
目前,我是唯一一个使用该网站的人,所以我完全知道其他人不可能创建会话,但是,确定,我在启动session_start()之后立即存储了IP地址我的会话类..而且很低,这是我的IP地址不断生成。登录后,数据库中又添加了5或6条记录,每条记录都包含我的IP地址,只有一条记录包含会话信息。
现在,网站运行正常,但我知道这不是正常行为。我只调用了session_start()一次,除了登录之外,我还没有在网站的任何地方调用regenerate_id,但是即使在登录之前,我也会在访问该网站时添加三条记录。
我想知道这是否是一个已知问题,并且如果有人可以梳理我的代码,看看他们是否能看到任何可能导致这种奇怪行为的事情,因为不幸的是,谷歌上的一个小时左右,搜索SO还没有结果很多(除了保存问题没有回答的问题)
class Sessions {
private $life_time, $database;
public function __construct()
{
$this->life_time = DatabaseConfig::read('SESSION_MAX_LIFETIME'); // Set within a config file, returns 1440
$this->database = DatabaseCore::getInstance(); // Basically allows me to create only one instance of the database to avoid overhead from multiple persistent connections.
session_set_save_handler(
array( &$this, "NewSession" ),
array( &$this, "CloseSession" ),
array( &$this, "ReadSession" ),
array( &$this, "WriteSession"),
array( &$this, "DestroySession"),
array( &$this, "CleanSessions" )
);
session_name("SESSION_GEEK_PANEL");
session_start();
}
public function NewSession( $save_path, $session_name ) {
$sess_save_path = $save_path;
return true;
}
public function ReadSession( $id ) {
$sth = $this->database->dbh->prepare("SELECT `session_data` FROM `sessions` WHERE `session_id` = :session_id ");
$sth->execute(array(
':session_id' => $id
));
if( $sth->rowCount() > 0 )
{
$row = $sth->fetch();
$data = $row['session_data'];
}
return $data;
}
public function WriteSession( $id, $data ) {
$sth = $this->database->dbh->prepare("REPLACE `sessions` (`session_id`, `session_data`, `expires`) VALUES( :id, :data, :expires )");
$sth->execute(array(
':id' => $id,
':data' => $data,
':expires' => time() + $this->life_time
));
return true;
}
public function DestroySession( $id ) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
$sth = $this->database->dbh->prepare("DELETE FROM `sessions` WHERE `session_id` = :id");
$sth->execute(array(
':id' => $id
));
return true;
}
public function CleanSessions() {
$sth = $this->database->dbh->prepare("DELETE FROM `sessions` WHERE `expires` < :time");
$sth->execute(array(
':time' => time()
));
return true;
}
public function CloseSession() {
return true;
}
}
DatabaseConfig::write('SESSION_MAX_LIFETIME', MAX_SESSION_LIFE);
非常感谢所有帮助,最后..这可能是主机或PHP INI文件的错误吗?谢谢:))
答案 0 :(得分:0)
你在PHP INI中检查过session.auto_start吗?