0
我不確定這裏有什麼錯,但我已經嘗試從字面上解決一個非常煩人的問題,這個問題一直困擾着我的網站,那就是PHP爲每個用戶生成多個會話。PHP正在生成多個會話
目前,我是唯一使用該站點的人,所以我完全清楚不會有其他人創建會話的可能性,但是,確保在啓動session_start()後立即存儲IP地址,在我的會話類..低,看,這是我的IP地址不斷生成。登錄後,會有5到6條記錄添加到數據庫中,每條記錄都包含我的IP地址,只有一條記錄會話信息。
現在,網站工作正常,但我知道這是不正常的行爲。我只調用了session_start()一次,除了登錄之外,我沒有在網站的任何地方調用regenerate_id,但是即使在我訪問該網站之後立即添加了三條記錄之前,也是如此。
我在想,如果這是一個已知問題,並且任何人都可以梳理我的代碼,看看他們是否能看到任何可能導致這種奇怪行爲的東西,因爲不幸的是,還沒有(從與保存問題懸而未決的問題分開)
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 /關 – 2013-04-09 22:09:52