WRInaute passionné
Me voici de retour avec un autre script. Cette fois-ci, il s'agit de trouver une alternative aux cookies et aux variables de session pour stocker des informations relatives à un visiteur de votre site.
Les cookies s'acquitent généralement bien de cette tache, encore faut-il que votre visiteur les accepte (20% de mes visiteurs n'acceptent pas les cookies!)
Les variables de session sont également un bon moyen de conserver des variables d'une page à l'autre mais présentent deux inconvegnants:
- le nombre de sessions n'est pas ilimité
- le passage de variables de session dans l'url peut avoir de graves incidence sur la prise en compte de vos pages par les moteurs de recherche https://www.webrankinfo.com/dossiers/conseils/relancer-referencement
php nous fournis une alternative avec la possibilité de créer des blocks mémoire partagées accessible à tout les script fonctionnant sur le serveur(gestion des droit d'accés identique à la gestion des droits d'accés fichier linux) grace à un identifiant.
L'exemple dont je donne les sources permet de stocker dans un file de 50 enregistrement, l'ip d'un visiteur et d'y assoicier une valeur de 0 à 9. Le timestamp correspondant à la date/heure de création ou de mise ajour de la valeur est également stocké ce qui permet de faire tourner la file de façon à ce que lorsque les 50 enregistrements sont utilisés, on écrase le plus ancien. (une manère pour obtenir dans un espace fini une capacité pseudo infinie de stockage si on la rapproche à la durée de vie de l'information)
Attention: c'est un exemple pour expliquer le mécanisme! à vous d'immaginer comment utiliser cette fonctionnalité.
Par exemple, sur le site de mon profil, je gere 4 onglets en DHTML sur la page d'accueil. Ce mécanisme me permet de mémoriser sur quel onglet de la page d'accueil était le visiteur afin de restituer le contenu de cet l'onglet lorsque l'internaute:
- revient sur page d'accueil
- utilise les bouton prec et suiv de son navigateur
Les autres utilisations étant disons... plus stratégiques, je n'en parlerais pas ici :wink: Mais je sais que les wrinautes ont beaucoup d'idées!
ce script permet d'initialiser le block de mémoire partagé:
celui-ci permet de détruire le block de mémoire partagée et libère la mémoire!
enfin, le script suivant permet de lire ( appel sans parametre dans l'url) ou d'écrire une valeur dans le bloc de mémoire partagée (appel avec le parametre Val=votrevaleur dans l'url methode GET):
Voila! J'utilise la mémoire partagée pour de nombreuses taches sur mes sites et cela fonctionne trés bien en consommant peu de ressources!
Les cookies s'acquitent généralement bien de cette tache, encore faut-il que votre visiteur les accepte (20% de mes visiteurs n'acceptent pas les cookies!)
Les variables de session sont également un bon moyen de conserver des variables d'une page à l'autre mais présentent deux inconvegnants:
- le nombre de sessions n'est pas ilimité
- le passage de variables de session dans l'url peut avoir de graves incidence sur la prise en compte de vos pages par les moteurs de recherche https://www.webrankinfo.com/dossiers/conseils/relancer-referencement
php nous fournis une alternative avec la possibilité de créer des blocks mémoire partagées accessible à tout les script fonctionnant sur le serveur(gestion des droit d'accés identique à la gestion des droits d'accés fichier linux) grace à un identifiant.
L'exemple dont je donne les sources permet de stocker dans un file de 50 enregistrement, l'ip d'un visiteur et d'y assoicier une valeur de 0 à 9. Le timestamp correspondant à la date/heure de création ou de mise ajour de la valeur est également stocké ce qui permet de faire tourner la file de façon à ce que lorsque les 50 enregistrements sont utilisés, on écrase le plus ancien. (une manère pour obtenir dans un espace fini une capacité pseudo infinie de stockage si on la rapproche à la durée de vie de l'information)
Attention: c'est un exemple pour expliquer le mécanisme! à vous d'immaginer comment utiliser cette fonctionnalité.
Par exemple, sur le site de mon profil, je gere 4 onglets en DHTML sur la page d'accueil. Ce mécanisme me permet de mémoriser sur quel onglet de la page d'accueil était le visiteur afin de restituer le contenu de cet l'onglet lorsque l'internaute:
- revient sur page d'accueil
- utilise les bouton prec et suiv de son navigateur
Les autres utilisations étant disons... plus stratégiques, je n'en parlerais pas ici :wink: Mais je sais que les wrinautes ont beaucoup d'idées!
ce script permet d'initialiser le block de mémoire partagé:
Code:
<?php
$enre=time()."-xxxx.xxxx.xxxx.xxxx-x"; //on génére la chaine de caractères par défaut
$mem=""; // on initialise la variable mémoire
for($i=0;$i<50;$i++) { // on initilise la variable mémoire avec 50 enregistrements
$mem.=$enre;
if($i!=49) $mem.=";"; // on sépare chaque enregistrement par le car ";" sauf en fin de mémoire
}
$shm_id = @shmop_open(0xf00, "c", 0644, strlen($mem)); // création du block mémoire partagé
if(!$shm_id) { // on vérifie si la créatioon du block mémoire partagé a réussi
echo "<div align=center>Erreur: Impossible de créer la mémoire partagée.</div><br>";
} else {
$shm_bytes_written = @shmop_write($shm_id, $mem, 0); // Ecriture dans le block de mémoire partagée
echo "<div align=center>Création de la mémoire partagée.</div><br>";
}
?>
celui-ci permet de détruire le block de mémoire partagée et libère la mémoire!
Code:
<?php
$shm_id = @shmop_open(0xf00, "w", 0, 0); // création d'un handle pour notre block mémoire
shmop_delete($shm_id); // destruction du block mémoire partagée
echo 'block mémoire detruit';
?>
Code:
<?php
if(isset($_GET['Val'])) $Val=$_GET['Val']; //on récupére la valeur à écrire dans le block mémoire si elle existe
$shm_id = @shmop_open(0xf00, "w", 0, 0); // on crée un handle pour acceder à notre block mémoire partagé
if ($shm_id) { // le block mémoire partagé existe
$ok=sem_get (0xf00); // demande de lecture du block mémoire partagée puis interdit l'acces au block mémoire partagé
if(sem_acquire ($ok)) { // l'accés au block mémoire est authorisé
$shm_size=@shmop_size ($shm_id); // lecture de la taille du block mémoire partagée
$tmp=substr(@shmop_read($shm_id, 0, $shm_size),0,16499); // lecture du block mémoire partagée
$tab=split(";",$tmp); // création d'un tableau d'enregistrement à partir du block mémoire partégée
$trouve=false;
$mem=array();
for($i=0;$i<50;$i++) { // on récupére nos valeur du bloc mémoire partagé dans un tableau
$val=split('-',$tab[$i]);
$Enre=array ('time' => $val[0], 'ip' => $val[1], 'value' => $val[2]);
$mem[$i]=$Enre;
if(str_replace('*','',$Enre['ip'])==trim($_SERVER['REMOTE_ADDR'])) { // on recherche si l'ip de l'internaute existe déjà
$trouve=true; // l'ip existe
$mem[$i]['time']=time(); // on met la date à jour
if(isset($_GET['Val'])) $mem[$i]['value']=$Val; // si valeur passée en paramétre, on la stocke
$memvalue=$mem[$i]['value']; // on lit la valeur correspondant à l'ip de l'internaute
}
}
sort($mem); // on trie notre tableau par date d'ancienneté
if(!$trouve) { // l'ip de l'internaute n'existe pas
$mem[0]['time']=time(); // on stocke la date actuelle
$mem[0]['ip']=trim($_SERVER['REMOTE_ADDR']); // on stocke l'ip de l'internaute
if(isset($_GET['Val'])) $mem[0]['value']=$Val; else $mem[0]['value']=1; // ons stocke la valeur passée en paramètre ou 1 par défaut
$memvalue=$mem[0]['value']; // on récupére la valeur associée à l'ip
}
$memwrite=""; // initialise une chaine vide
for($i=0;$i<50;$i++) { // on reconstitue une chaine avec nos 50 enregistrements
$memwrite.=$mem[$i]['time'].'-'.str_pad($mem[$i]['ip'],15,'*',STR_PAD_RIGHT).'-'.substr($mem[$i]['value'],0,1); // l'ip est complétée par "*" pour atteindre 15 caractères
if($i!=$memsize-1) $memwrite.=';';
}
$shm_bytes_written = @shmop_write($shm_id, $memwrite, 0); // sauvegarde le block memoire partagé
sem_release($ok);// autorise la lecture du block mémoire partagée
}
}
echo $memvalue; // on affiche la valeur 'associée à l'ip de l'internaute
exit(); // fin du script?>
Voila! J'utilise la mémoire partagée pour de nombreuses taches sur mes sites et cela fonctionne trés bien en consommant peu de ressources!