Heim  >  Artikel  >  Backend-Entwicklung  >  Was sind die Schritte, um Redis Long Connection in PHP zu verwenden?

Was sind die Schritte, um Redis Long Connection in PHP zu verwenden?

php中世界最好的语言
php中世界最好的语言Original
2018-05-18 14:47:122627Durchsuche

Dieses Mal werde ich Ihnen die Schritte zur Verwendung von Redis Long Connection in PHP vorstellen. Was sind die Vorsichtsmaßnahmen für die Verwendung von Redis Long Connection in PHP? Das Folgende ist ein praktischer Fall, schauen wir uns das an.

php-redis-Projektadresse auf Github: https://github.com/phpredis/phpredis

pconnect-Funktionsdeklaration

Wobei time_out angibt, wie viele Sekunden der Client inaktiv sein wird, bevor die Verbindung getrennt wird. Die Funktion „connection“ gibt „true“ zurück, wenn sie erfolgreich ist, und „false“, wenn sie fehlschlägt:

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)

Das folgende Beispiel beschreibt die Wiederverwendung von pconnect-Verbindungen.

$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.

Einführung in die Verwendung von pconnect

Eine kurze Beschreibung der pconnect-Methode

Verwenden Sie diese Methode, um eine Verbindung zu erstellen. Die Verbindung wird nach dem Aufruf der Close-Methode nicht geschlossen, sondern erst nach Beendigung des Prozesses.

[Zu überprüfen] Wenn Sie eine lange Verbindung verwenden, muss das Timeout-Konfigurationselement in der Redis-Konfigurationsdatei auf 0 gesetzt werden, andernfalls wird die Verbindung in der Verbindung unterbrochen Pool läuft aufgrund einer Zeitüberschreitung ab.

Erklären Sie pconnect für PHP-FPM

Eine lange Verbindung wird erst beendet, nachdem der PHP-FPM-Prozess beendet ist Der Lebenszyklusder Verbindung ist der Lebenszyklus des PHP-FPM-Prozesses.
Im Vergleich zu kürzeren Verbindungen wird bei jedem PHP-FPM-Aufruf eine Redis-Verbindung generiert. Die Darstellung auf dem Server ist ein übermäßiger Time_out-Verbindungsstatus.
Im Gegensatz dazu teilen sich bei langen Verbindungen alle von PHP-FPM aufgerufenen CGIs nur eine lange Verbindung, sodass nur eine feste Anzahl von Time_outs generiert wird.

Lange Verbindung schließen

kann die Methoden close und unset aufrufen, aber die beiden sind sehr unterschiedlich:

- close Die Funktion besteht nur darin, den aktuellen PHP-Prozess daran zu hindern, Redis-Anfragen zu stellen, sie kann jedoch die lange Redis-Verbindung nicht tatsächlich schließen. Die Verbindung wird in nachfolgenden Anfragen weiterhin wiederverwendet, bis der Lebenszyklus des FPM-Prozesses endet. So close zerstört das Redis-Objekt nicht, sondern trennt es nur.

- nicht gesetzte Variablen werden zerstört. Beachten Sie auch, dass Sie bei Verwendung von pconnect nicht schließen müssen. Wenn die aktuelle Ausführungszeit des Skripts sehr lang ist, wird immer eine Verbindung belegt.

So ermitteln Sie, ob das aktuelle Redis verbunden ist

Das entsprechende Problem besteht darin, festzustellen, ob die aktuelle Instanz im Singleton-Modus gültig ist.

Es ist üblich, echo aufzurufen, um zu bestimmen, ob die Zeichenfolge selbst normal zurückgegeben wird, oder ping aufzurufen, um zu sehen, ob der Rückgabewert +PONG ist.

Aber Sie müssen besonders vorsichtig sein, wenn die Redis-Verbindung getrennt wird und Echo und Ping (Rückgabe von „+POMG“) eine Ausnahme auslösen. Es muss also über den Ausnahmeabfangmechanismus behandelt werden.

Code-Analyse von Problemen bei der Wiederverwendung von Pconnect-Verbindungen

Situation 1: Nicht-Singleton-Modus.

Erklärung: Instanz a und Instanz b teilen sich eine Verbindung, und Instanz b ändert die Verbindung von Instanz a:
Das folgende Beispiel führt also dazu, dass der Endwert von Instanz $a 2 wird, erfordert besondere Aufmerksamkeit.

$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了。因为这两个连接共用了一个连接通道。

Fall 2: Singleton-Modus.

Ändern Sie den obigen Code so, dass sowohl a als auch b über getInstance generiert werden. Voraussetzung für die Generierung ist die Feststellung, ob die aktuelle Instanz existiert. Der Verwirrungspunkt des Singleton-Modus ist:

$a generiert eine Instanz. Zu diesem Zeitpunkt verwendet $b die Instanz von $a und ändert dann die Verbindung von $a $a muss die geänderte Instanz von $b sein, die aufgerufen wird. Das Gleiche wie Situation zwei.
Der Code für den Singleton-Modus lautet wie folgt:

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

Beide Fälle veranschaulichen das Problem der Wiederverwendung von Verbindungen. Wie kann dieser Fehler behoben werden? Zwei Punkte:

1. Generieren Sie eine einzelne Instanz für jede Datenbank.
2. Vermeiden Sie Probleme bei der Wiederverwendung von Verbindungen.

So kann der Code angepasst werden, um ein Singleton-Array zurückzugeben:

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];
}

Wichtige Dinge

Vermeiden Sie die Verwendung der Aufgabe Verwenden Sie Redis-Objekte in Klassenmitgliedsvariablen.

Im Singleton-Modus von Redis wird die Ablaufzeit von time_out deklariert. Wenn der Anlass für die Redis-Verarbeitung eine Aufgabe ist und das Intervall zwischen Aufgabenaufrufen an Redis relativ lang ist. Wenn das Intervall größer als time_out ist, trennt Redis die Verbindung und alle Vorgänge auf Redis schlagen fehl. Die Lösung besteht darin, diese aufrufende Methode zu vermeiden und sie auszuführen, indem die Redis-Klasse am Ort des Aufrufs dynamisch deklariert wird. Bei einem solchen Problem wird nicht zwischen langen und kurzen Verbindungen unterschieden, und es handelt sich um einen Fehler in der aufrufenden Methode.

Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!

Empfohlene Lektüre:

php+mysql zur Implementierung von Werbeklickstatistiken (mit Code)

Wie wäre es mit dem chinesischen PHP-Tool? Klasse ChineseUtil Konvertiert chinesische Schriftzeichen in Pinyin

Das obige ist der detaillierte Inhalt vonWas sind die Schritte, um Redis Long Connection in PHP zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn