2013-11-23 123 views
0

我想知道這是否可以取代$ _SESSION。我想創建一個使用$ _SESSION來記錄我的數據庫我的會話系統,就像這樣:

$_SESSION['identifier'] = 'value'; // Perform insert/update on my DBMS 
echo $_SESSION['identifier']; // Perform select on my DBMS 

我想我的系統是完全透明的,功能性,如果我的一堂課是不可用或由網站禁用管理員。

謝謝你的幫助。

回答

0

這裏是一個示例代碼:

$sess = new sess(); 

session_start(); 
$_SESSION =& $sess; 

//test 
$_SESSION['value'] = 'ccc'; 

some_test_func(); 
function some_test_func() { 
//test again in different scope 
$_SESSION['anotehr_value'] = 444; 
} 


class sess implements \Iterator, \ArrayAccess, \Countable 
{ 

    protected $session_data; 

    public final function rewind() { 
     reset($this->session_data); 
    } 

    public final function current() { 
     $var = current($this->session_data); 
     return $var; 
    } 

    public final function key() { 
     $var = key($this->session_data); 
     return $var; 
    } 

    public final function next() { 
     $var = next($this->session_data); 
     return $var; 
    } 

    public final function valid() { 
     $var = $this->current() !== false; 
     return $var; 
    } 

    public final function offsetExists($offset) { 
     //Database query comes here (SELECT) 
     print 'SELECT var_value FROM session_data WHERE var_name = :offset AND session_id = :session_id'; 
     $session_id = session_id(); 
     return isset($this->session_data[$offset]); 
    } 

    public final function offsetGet($offset) { 
     //Database query comes here (SELECT) 
     print 'SELECT var_value FROM session_data WHERE var_name = :offset AND session_id = :session_id'; 
     $session_id = session_id(); 
     return $this->session_data[$offset]; 
    } 

    public final function offsetSet($offset,$value) { 
     //Database query comes here (REPLACE by primary key) 
     print 'REPLACE INTO session_data (session_id, var_name, var_value) VALUES (:session_id, :offset, :value)'; 
     $session_id = session_id(); 
     $this->session_data[$offset] = $value; 
    } 

    public final function offsetUnset($offset) { 
     //Database query comes here (DELETE) 
     print 'DELETE FROM session_data WHERE var_name = :offset AND session_id = :session_id'; 
     $session_id = session_id(); 
     unset($this->session_data[$offset]); 
    } 

    public final function count() { 
     return count($this->session_data); 
    } 
} 

您可以通過添加還超載擴展。 您可以使用$ session_data作爲緩存副本或使用所有查詢(如果您可以避免)。在一般情況下,我會建議不要針對每個會話更改進行查詢(將會有很多數據庫寫入)。也許你這樣做是爲了避免覆蓋會話,但爲此,您可以使用鎖定機制將所有請求序列化爲相同的session_id。 另一個原因,我會避免這個,因爲這條線: $ _SESSION = & $ sess; 可能不適用於某些未來的PHP版本。 (我測試了這個PHP 5.3.20)。

另一個問題是,未來的其他人可能會使用你的代碼,甚至不會懷疑$ _SESSION在後臺做什麼......你應該明確地記錄這種行爲。

P.S.或者你只是想將會話存儲在數據庫中。那麼你應該看看http://php.net/manual/en/function.session-set-save-handler.php 在這裏你可以逃脫只有兩個查詢 - 在會話讀和會話寫。

+0

完美,謝謝! – Gecko