我想知道這是否可以取代$ _SESSION。我想創建一個使用$ _SESSION來記錄我的數據庫我的會話系統,就像這樣:
$_SESSION['identifier'] = 'value'; // Perform insert/update on my DBMS
echo $_SESSION['identifier']; // Perform select on my DBMS
我想我的系統是完全透明的,功能性,如果我的一堂課是不可用或由網站禁用管理員。
謝謝你的幫助。
我想知道這是否可以取代$ _SESSION。我想創建一個使用$ _SESSION來記錄我的數據庫我的會話系統,就像這樣:
$_SESSION['identifier'] = 'value'; // Perform insert/update on my DBMS
echo $_SESSION['identifier']; // Perform select on my DBMS
我想我的系統是完全透明的,功能性,如果我的一堂課是不可用或由網站禁用管理員。
謝謝你的幫助。
這裏是一個示例代碼:
$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 在這裏你可以逃脫只有兩個查詢 - 在會話讀和會話寫。
完美,謝謝! – Gecko