2013-04-09 44 views
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

你在PHP INI中檢查過session.auto_start嗎?

+0

是的,這是我原來的想法,它被設置爲0 /關 – 2013-04-09 22:09:52