Ich habe bereits zwei Artikel geschrieben: „Anpassen von SESSION (2) – Datenbankspeicherung“ und „Warum ich Session nicht verwende“.
Doch später stellte sich heraus, dass es Probleme gab. Die frühere Verarbeitung ist in der Praxis nahezu nutzlos und das Sitzungsrecycling muss separat gehandhabt werden. Letzterer betreibt häufig die Datenbank, was zu großen Leistungsproblemen führt.
Nach sorgfältiger Überlegung in den letzten zwei Tagen wurde ein grober Plan vorgelegt, es gab jedoch keinen konkreten und detaillierten Test.
1. Kombinieren Sie Sitzungsverarbeitung und Statistiken. Besucher werden ebenfalls erfasst.
2. Verwenden Sie Datenbank und Cookies vollständig, um Sitzungsfunktionen zu simulieren.
3. Die Vorgänge des Benutzers in der Sitzung sollten so weit wie möglich in einer SQL-Anweisung abgeschlossen werden. Wenn die Sitzung nicht benötigt wird, gibt es absolut nicht mehr als eine Abfrage.
4. Aus Gründen der Effizienz ist das Sitzungsrecycling nicht integriert, es wird jedoch eine Schnittstelle bereitgestellt, die zur Implementierung aufgerufen werden kann.
Der Code wird vorübergehend ohne detaillierte Erklärung angegeben.
sql
TABELLE „*****_session“ ERSTELLEN (
`sid` char(32) NICHT NULL,
`uid` int(10) NICHT NULL,
„Benutzername“ char(32) NICHT NULL,
„Benutzertyp“ tinyint(1) NICHT NULL,
`activetime` int(10) NOT NULL,
`expiry` int(10) NICHT NULL,
`ip` char(15) NICHT NULL,
`url` char(80) NICHT NULL,
„Wert“ char(255) NICHT NULL,
PRIMÄRSCHLÜSSEL („sid“)
) ENGINE=MEMORY DEFAULT CHARSET=utf8;
PHP-Code
<?
Unterrichtsstunde{
private $_sessionPrex= '';//Sitzungspräfix
private $_time = '';//aktuelle Zeit
private $_model = null; //Datenbankbetriebsmodell
private $_expiry = 1200;//Sitzungsgültigkeitszeit
private $_domain = '';//Sitzungsbereich
protected $isNew = 0;//Bestimmen Sie die Operationsaktion 0, aktualisieren Sie 1 und erhöhen Sie sie
protected $session = array();//entsprechender Sitzungsdatensatz
öffentliche Funktion __construct($options){
$this->_setOptions($options);
if(empty($this->_time))$this->_time = time();
$this->session['activetime'] = $this->_time;
}
öffentliche Funktion start(){
$this->_getSid();
}
öffentlicher Funktionssatz($key,$value){
if(in_array($key,array('uid','username','usertype','url','expiry'))){
if($key == 'expiry'){
$this->_setCookie($this->_sessionPrex.'_sid',$this->session['sid'],$value);
$this->_setCookie($this->_sessionPrex.'_uid',$this->session['uid'],$value);
}
$this->session[$key] = $value;
}anders{
$other = $this->session['value'];
$other[$key] = $value;
$this->session['value'] = $other;
}
}
öffentliche Funktion get($key){
if(in_array($key,array('uid','username','usertype','url','expiry'))){
return $this->session[$key];
}anders{
if(isset($this->session['value'][$key])){
return $this->session['value'][$key];
}
null zurückgeben;
}
}
öffentliche Funktion gc($file,$time = 1200){
$lasttime = file_get_contents($file);
if($lasttime + $time<$this->_time){
file_put_contents($file,$this->_time);
return $this->_model->delete('activetime+expiry<'.$this->_time);
}
}
öffentliche Funktion destroy(){
$this->session['uid'] = 0;
$this->session['username'] = '';
$this->session['usertype'] = -1;
$this->session['expiry'] = $this->_expiry;
$this->session['value'] = array();
$this->_setCookie($this->_sessionPrex.'_sid',$this->session['sid'],$this->_expiry);
$this->_setCookie($this->_sessionPrex.'_uid',$this->session['uid'],$this->_expiry);
}
öffentliche Funktion __destruct(){
$this->_save();
}
private Funktion _save(){
$dbSession = $this->session;
$dbSession['value'] = serialize($dbSession['value']);
if(strlen($dbSession['value'])>255)$this->_error('session->value is too long!');
if($this->isNew == 1){
//Zunahme
$this->_model->insert($dbSession);
}anders{
//erneuern
$sid = $dbSession['sid'];
$this->_model->update(array_slice($dbSession,1),'sid=''.$sid.''');
}
}
private Funktion _getSession($sid){
$dbSession = $this->_model->detail('sid = ''.$sid.''');
if(!$dbSession)return false;
$dbSession['value'] = unserialize($dbSession['value']);
$this->session = array_merge($dbSession,$this->session);
return true;
}
private Funktion _getSid(){
$sid = strip_tags($_COOKIE[$this->_sessionPrex.'_sid']);
if(strlen($sid)==32){
if($this->_getSession($sid)){
return true;
}
}anders{
$sid = md5(time().mt_rand(1000,10000));
$this->_setCookie($this->_sessionPrex.'_sid',$sid);
}
$this->_setCookie($this->_sessionPrex.'_uid',0);
$this->session = array(
'uid' => 0,
'Benutzername' => '',
'Benutzertyp' => -1,
'activetime' => $this->_time,
'ip' => $this->_getip(),
'url' => strip_tags($_SERVER['REQUEST_URI']),
'expiry' =>$this->_expiry,
'Wert' => array()
);
$this->isNew = 1;
$this->session['sid'] = $sid;
}
private Funktion _setCookie($name,$value,$expiry=0){
if(empty($expiry))$expiry = $this->_expiry;
if(empty($this->_domain)){
setcookie($name,$value,$this->_time + $expiry,'/');
}anders{
setcookie($name,$value,$this->_time + $expiry,'/',$this->_domain);
}
}
private Funktion _getip(){
return getip();
}
private Funktion _setOptions($options){
foreach ($options as $key=>$value){
if(in_array($key,array('sessionPrex','time','model','expiry','domain'))){
$key = '_'.$key;
$this->$key = $value;
}
}
}
private Funktion _error($msg){
throw new Phpbean_Exception($msg);
}
}
?>
(Beachten Sie, dass dieser Code nicht direkt verwendet werden kann. Dieser Artikel bietet hauptsächlich eine Idee.)