Maison  >  Article  >  développement back-end  >  PHP utilise Redis au lieu d'un fichier pour stocker la session

PHP utilise Redis au lieu d'un fichier pour stocker la session

墨辰丷
墨辰丷original
2018-05-25 14:35:181773parcourir

Cet article présente principalement comment PHP utilise Redis au lieu de fichiers pour stocker les sessions. Il analyse en détail les méthodes de fonctionnement de base des sessions et les techniques associées d'utilisation de Redis pour stocker les sessions sous forme d'exemples.

L'exemple de cet article décrit comment PHP utilise Redis au lieu du stockage de fichiers pour stocker la session. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

PHP utilise des fichiers pour stocker les sessions par défaut. Si le degré de concurrence est important, l'efficacité est très faible. EtRedis prend très bien en charge la simultanéité élevée, vous pouvez donc utiliser Redis pour remplacer la session de stockage de fichiers.

Ici, nous présentons la fonction et l'utilisation de la fonction session_set_save_handler de PHP. Cette fonction définit les fonctions de sauvegarde de session au niveau utilisateur (telles que l'ouverture, la fermeture, l'écriture, etc.).

Le prototype est le suivant :

bool session_set_save_hanler(callback open,callback close,callback read,callback write,callback destory,callback gc)

Les paramètres de la fonction session_set_save_handler sont les suivants :


Paramètres Description
ouvert Appelé lorsque la session est ouvert cette fonction. Reçoit deux paramètres. Le premier paramètre est le chemin pour maintenir la session. Le deuxième paramètre est le nom de la session
close Cette fonction est appelée lorsque le. l'opération de session est terminée. Ne reçoit pas de paramètres.
read prend l'ID de session comme paramètre. Obtenez des données de la partie de stockage de données via l'ID de session et renvoyez ces données. Si les données sont vides, une chaîne vide peut être renvoyée. Cette fonction est déclenchée avant l'appel <span style="font-family:新宋体">session_start</span>
write est appelée lorsque les données sont stockées.Il y a deux paramètres, l'un est l'ID de session, l'autre est les données de session
destroy La destruction est déclenchée lorsque le <span style="font-family:新宋体">session_destroy</span> la fonction est appelée fonction. Il n'y a qu'un seul paramètre ID de session
gc Déclenché lorsque php exécute le mécanisme de collecte des ordures de session


Avant d'utiliser cette fonction, définissez l'option session.save_handler dans le fichier de configuration php.ini sur user, sinon session_set_save_handle ne prendra pas effet.

Écrivez une classe de gestion de session sessionManager.php, le code est le suivant :

<?php
class SessionManager{
 private $redis;
 private $sessionSavePath;
 private $sessionName;
 private $sessionExpireTime=30;//redis,session的过期时间为30s
 public function __construct(){
 $this->redis = new Redis();//创建phpredis实例
 $this->redis->connect(&#39;127.0.0.1&#39;,6379);//连接redis
 $this->redis->auth("107lab");//授权
 $retval = session_set_save_handler(
  array($this,"open"),
  array($this,"close"),
  array($this,"read"),
  array($this,"write"),
  array($this,"destroy"),
  array($this,"gc")
 );
 session_start();
 }
 public function open($path,$name){
 return true;
 }
 public function close(){
 return true;
 }
 public function read($id){
 $value = $this->redis->get($id);//获取redis中的指定记录
 if($value){
  return $value;
 }else{
  return &#39;&#39;;
 }
 }
 public function write($id,$data){
 if($this->redis->set($id,$data)){//以session ID为键,存储
  $this->redis->expire($id,$this->sessionExpireTime);//设置redis中数据的过期时间,即session的过期时间
  return true;
 }
 return false;
 }
 public function destroy($id){
 if($this->redis->delete($id)){//删除redis中的指定记录
  return true;
 }
 return false;
 }
 public function gc($maxlifetime){
 return true;
 }
 public function __destruct(){
 session_write_close();
 }
}

Le constructeur SessionManager est principalement utilisé pour se connecter à Redis Pour le serveur, utilisez la fonction session_set_save_handler pour définir la fonction de rappel de session et appelez la fonction session_start pour activer la fonction de session. Étant donné que les fonctions de rappel open, close et gc dans cet exemple ne sont pas très utiles, elles renvoient directement true.

Dans la fonction de rappel d'écriture, utilisez l'ID de session comme clé, stockez les données de session comme valeur dans le serveur Redis et définissez le délai d'expiration de la session sur 30 secondes. Dans la fonction de rappel de lecture, utilisez l'ID de session comme clé pour lire les données du serveur Redis et renvoyer ces données. Dans la fonction de rappel destroy, l'ID de session est utilisé comme clé pour supprimer les données de session correspondantes du serveur Redis.

Pour l'utiliser, incluez simplement la classe SessionManager et instanciez un objet SessionManager. Créez un fichier session_set.php ci-dessous. Saisissez le code

<?php
 include(&#39;SessionManager.php&#39;);
 new SessionManager();
 $_SESSION[&#39;username&#39;] = &#39;captain&#39;;

puis créez un fichier session_get.php et saisissez le code suivant :

<?php
 include(&#39;SessionManager.php&#39;);
 new SessionManager();
 echo $_SESSION[&#39;username&#39;];

Lors du test, accédez d'abord à session_set.php, puis accédez à session_get.php. Le résultat de sortie est le suivant :

Vérifiez ensuite le. base de données redis, comme suit Montré

127.0.0.1:6379> keys *
1) "oe94eic337slnjv1bvlreoa574"
127.0.0.1:6379> get oe94eic337slnjv1bvlreoa574
"username|s:7:\"captain\";"

Ce qui précède est l'intégralité du contenu de cet article, j'espère qu'il sera utile pour l'étude de tout le monde.


Recommandations associées :

Méthode PHP pour obtenir des nombres aléatoires à 6 chiffres qui n'existent pas dans redis

Implémentation PHP de redisméthode Weibo de publication de file d'attente de messages

Fonctionnement du framework CI (CodeIgniter)redisAnalyse des étapes

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn