J'ai déjà écrit deux articles, "Personnalisation de SESSION (2) - Sauvegarde de la base de données" et "Pourquoi je n'utilise pas de session".
Mais plus tard, on a découvert qu’il y avait des problèmes. Le premier traitement est pratiquement inutile dans la pratique et le recyclage des sessions doit être traité séparément. Ce dernier exploite fréquemment la base de données, provoquant de gros problèmes de performances.
Après un examen attentif au cours des deux derniers jours, un plan approximatif a été présenté, mais aucun test spécifique et détaillé n'a été effectué.
1. Combinez le traitement de session et les statistiques. Les visiteurs sont également enregistrés.
2. Utilisez entièrement la base de données et les cookies pour simuler les fonctions de session.
3. Dans la mesure du possible, les opérations de l'utilisateur sur la session doivent être effectuées dans une seule instruction SQL. Lorsque la session n'est pas nécessaire, il n'y a absolument qu'une seule requête.
4. Par souci d'efficacité, le recyclage de sessions n'est pas intégré, mais une interface est fournie et peut être appelée pour l'implémenter.
Le code est donné temporairement sans explication détaillée.
SQL
CRÉER TABLE `****_session` (
`sid` char(32) NON NULL,
`uid` int(10) NON NULL,
`username` char(32) NON NULL,
`usertype` tinyint(1) NON NULL,
`activetime` int(10) NON NULL,
`expiration` int(10) NON NULL,
`ip` char(15) NON NULL,
`url` char(80) NON NULL,
`value` char(255) NON NULL,
CLÉ PRIMAIRE (`sid`)
) MOTEUR=MÉMOIRE PAR DÉFAUT CHARSET=utf8;
code php
<?
séance de cours{
private $_sessionPrex= '';//préfixe de session
privé $_time = '';//heure actuelle
private $_model = null; //Modèle d'opération de base de données
private $_expiry = 1200;//durée de validité de la session
privé $_domain = '';//portée de la session
protected $isNew = 0;//déterminer l'action d'opération 0 mise à jour 1 augmentation
protected $session = array();//enregistrement de session correspondant
fonction publique __construct($options){
$this->_setOptions($options);
if(empty($this->_time))$this->_time = time();
$this->session['activetime'] = $this->_time;
}
fonction publique start(){
$this->_getSid();
}
ensemble de fonctions publiques ($ clé, $ valeur) {
if(in_array($key,array('uid','username','usertype','url','expiry'))){
if($key == 'expiration'){
$this->_setCookie($this->_sessionPrex.'_sid',$this->session['sid'],$value);
$this->_setCookie($this->_sessionPrex.'_uid',$this->session['uid'],$value);
}
$this->session[$key] = $value;
}autre{
$autre = $this->session['value'];
$autre[$clé] = $valeur ;
$this->session['value'] = $autre;
}
}
fonction publique get ($ clé) {
if(in_array($key,array('uid','username','usertype','url','expiry'))){
return $this->session[$key];
}autre{
if(isset($this->session['value'][$key])){
return $this->session['value'][$key];
}
renvoie null ;
}
}
fonction publique gc ($ fichier, $ temps = 1200) {
$lasttime = file_get_contents($file);
si($lasttime + $time<$this->_time){
file_put_contents($file,$this->_time);
return $this->_model->delete('activetime+expiry<'.$this->_time);
}
}
fonction publique détruire(){
$this->session['uid'] = 0;
$this->session['nom d'utilisateur'] = '';
$this->session['usertype'] = -1;
$this->session['expiration'] = $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);
}
fonction publique __destruct(){
$this->_save();
}
fonction privée _save(){
$dbSession = $this->session ;
$dbSession['value'] = sérialiser($dbSession['value']);
if(strlen($dbSession['value'])>255)$this->_error('session->value est trop longue !');
si($this->isNew == 1){
//Augmenter
$this->_model->insert($dbSession);
}autre{
//renouveler
$sid = $dbSession['sid'];
$this->_model->update(array_slice($dbSession,1),'sid=''.$sid.''');
}
}
fonction privée _getSession($sid){
$dbSession = $this->_model->detail('sid = ''.$sid.''');
if(!$dbSession)return false;
$dbSession['value'] = unserialize($dbSession['value']);
$this->session = array_merge($dbSession,$this->session);
renvoie vrai ;
}
fonction privée _getSid(){
$sid = strip_tags($_COOKIE[$this->_sessionPrex.'_sid']);
si(strlen($sid)==32){
if($this->_getSession($sid)){
renvoie vrai ;
}
}autre{
$sid = md5(time().mt_rand(1000,10000));
$this->_setCookie($this->_sessionPrex.'_sid',$sid);
}
$this->_setCookie($this->_sessionPrex.'_uid',0);
$this->session = tableau(
'uid' => 0,
'nom d'utilisateur' => '',
'type d'utilisateur' => -1,
'activetime' => $this->_time,
'ip' => $this->_getip(),
'url' => strip_tags($_SERVER['REQUEST_URI']),
'expiration' =>$this->_expiry,
'valeur' => tableau()
);
$this->isNew = 1;
$this->session['sid'] = $sid;
}
fonction privée _setCookie($name,$value,$expiry=0){
if(empty($expiration))$expiration = $this->_expiry;
si(vide($this->_domain)){
setcookie($nom,$valeur,$this->_time + $expiry,'/');
}autre{
setcookie($name,$value,$this->_time + $expiry,'/',$this->_domain);
}
}
fonction privée _getip(){
return getip();
}
fonction privée _setOptions ($options){
foreach ($options comme $key=>$value){
if(in_array($key,array('sessionPrex','time','model','expiry','domain'))){
$clé = '_'.$clé;
$this->$key = $value ;
}
}
}
fonction privée _error($msg){
lancer une nouvelle Phpbean_Exception ($ msg);
}
}
?>
(Notez que ce code ne peut pas être utilisé directement, cet article donne principalement une idée)