Maison  >  Article  >  développement back-end  >  Quelles sont les étapes pour utiliser la connexion longue Redis en php

Quelles sont les étapes pour utiliser la connexion longue Redis en php

php中世界最好的语言
php中世界最好的语言original
2018-05-18 14:47:122569parcourir

Cette fois, je vais vous présenter les étapes pour utiliser la connexion longue Redis en PHP, quelles sont les précautions pour que PHP utilise la connexion longue Redis, ce qui suit est un cas pratique, jetons un coup d'œil.

Adresse du projet php-redis sur github : https://github.com/phpredis/phpredis

Déclaration de la fonction pconnect

Où time_out indique combien de secondes le client sera inactif avant de se déconnecter. La fonction connection renvoie true en cas de succès et false en cas d'échec :

pconnect(host, port, time_out, persistent_id, retry_interval)
    host: string. can be a host, or the path to a unix domain socket
    port: int, optional
    timeout: float, value in seconds (optional, default is 0 meaning unlimited)
    persistent_id: string. identity for the requested persistent connection
    retry_interval: int, value in milliseconds (optional)

L'exemple suivant détaille la réutilisation des connexions pconnect.

$redis->pconnect('127.0.0.1', 6379);
$redis->pconnect('127.0.0.1'); // 默认端口6379,跟上面的例子使用相同的连接。
$redis->pconnect('127.0.0.1', 6379, 2.5); // 设置了2.5秒的过期时间。将是不同于上面的新连接
$redis->pconnect('127.0.0.1', 6379, 2.5, 'x'); //设置了持久连接的id,将是不同于上面的新连接
$redis->pconnect('/tmp/redis.sock'); // unix domain socket - would be another connection than the four before.

Introduction à l'utilisation de pconnect

Une brève description de la méthode pconnect

Utilisez cette méthode Créez une connexion. La connexion ne sera pas fermée après l'appel de la méthode close. La connexion ne sera fermée qu'une fois le processus terminé.

[À vérifier] Si vous utilisez une connexion longue, l'élément de configuration du délai d'attente dans le fichier de configuration Redis doit être défini sur 0, sinon la connexion dans la connexion le pool expirera en raison d'un délai d'attente

Expliquez pconnect pour PHP-FPM

Une longue connexion ne se terminera qu'après la fin du processus PHP-FPM et le le cycle de viede la connexionC'est le cycle de vie du processus PHP-FPM.
Par rapport aux connexions plus courtes, une connexion Redis sera générée lors de chaque appel PHP-FPM. La représentation sur le serveur est un statut de connexion time_out excessif.
A l'inverse, les connexions longues, tous les CGI appelés par PHP-FPM ne partageront qu'une seule connexion longue, donc seul un nombre fixe de time_out sera généré.

Close longue connexion

peut appeler les méthodes close et unset, mais les deux sont très différentes :

- close La fonction sert uniquement à empêcher le processus PHP actuel d'effectuer des requêtes Redis, mais elle ne peut pas réellement fermer la longue connexion Redis. La connexion sera toujours réutilisée dans les requêtes ultérieures jusqu'à la fin du cycle de vie du processus FPM. Si proche ne détruit pas l'objet Redis, il le déconnecte simplement.

- non définies les variables seront détruites. Il convient également de noter que vous n'avez pas besoin de fermer si vous utilisez pconnect. Si le temps d'exécution du script actuel est très long, il occupera toujours une connexion.

Comment déterminer si Redis est actuellement connecté ?

Le problème équivalent est de déterminer si l'instance actuelle est valide en mode cas unique.

Il est d'usage d'appeler echo pour déterminer si la chaîne elle-même est renvoyée normalement, ou d'appeler ping pour voir si la valeur de retour est +PONG.

Mais vous devez être particulièrement prudent. Après la déconnexion de Redis, l'appel de echo et ping (renvoyant '+POMG') lèvera une exception. Il doit donc être géré via le mécanisme de capture d’exceptions.

Analyse du code des problèmes de réutilisation des connexions pconnect

Situation 1 : mode non singleton.

Explication : l'instance a et l'instance b partagent une connexion, et l'instance b modifie la connexion de l'instance a :
Donc, l'exemple suivant fait que la valeur finale de l'instance $a devient 2 , nécessite une attention particulière.

$a = pconnect(host, port, time_out);
select(3);
$a -> setex(id, 3);
echo $a -> get(id);
//之后执行下面的连接
$b = pconnect(host, port, time_out);
select(2);
$b->set(id,2)
echo $a->get(id);  //这个id操作的db变成了2,不再是之前的3了。因为这两个连接共用了一个连接通道。

Cas 2 : Mode Singleton.

Modifiez le code ci-dessus pour que a et b soient générés via getInstance. La condition préalable à la génération est de déterminer si l'instance actuelle existe. Le point de confusion du mode singleton est :

$a génère une instance à ce moment, $b est généré par l'instance de $a, puis modifie la connexion de $a. $a doit être l'instance modifiée de $b appelée. Identique à la situation deux.
Le code du mode singleton est le suivant :

public static function getInstance($db = 0)
{
  if (!isset(self::$_instance)) {
    self::$_instance = new Redis();
  }
  self::_connect();
  self::$_instance->select($db);
  return self::$_instance;
}

Les deux cas illustrent le problème de la réutilisation des connexions. Comment corriger ce bug ? Deux points :

1. Générez une seule instance pour chaque base de données.
2. Évitez les problèmes de réutilisation des connexions.

Le code peut donc être ajusté pour renvoyer un tableau singleton :

public static function getInstance($db = 0)
{
  try{
    if (isset(self::$_instance[$db]) && self::$_instance[$db]->Ping() == 'Pong') {
      return self::$_instance[$db];
    }
  } catch (Exception $e) {
  }
  self::$_instance[$db] = new Redis();
  self::_connect($db);
  return self::$_instance[$db];
}

Choses à noter

Éviter d'utiliser objets redis dans les variables membres de la classe Task.

Dans le mode singleton de redis, le délai d'expiration de time_out est déclaré. Si l'occasion de traitement Redis est une tâche et que l'intervalle entre les appels de tâche à Redis est relativement long. Lorsque l'intervalle est supérieur à time_out, redis se déconnectera et toutes les opérations sur redis échoueront. La solution est d'éviter cette méthode appelante et de l'exécuter en déclarant dynamiquement la classe redis sur le lieu de l'appel. Ce problème ne fait pas de distinction entre les connexions longues et les liens courts, et il s'agit d'une erreur dans la méthode appelante.

Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur le site Web chinois de php !

Lecture recommandée :

php+mysql pour implémenter des statistiques de clics publicitaires (avec code)

Que diriez-vous de l'outil chinois PHP class ChineseUtil Convertir les caractères chinois en Pinyin

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