2010-09-01 7 views

Antwort

7

Nicht sicher, ob dies unterstützt wird, aber Sie sollten sich unbedingt Predis und Rediska ansehen, diese beiden (besonders Predis AFAIK) sind die besten verfügbaren PHP Redis Clients.

+0

danke antirez, ich habe noch nie Predis versucht, es scheint Unterstützung persistente Verbindung, ich glaube, dass eine C-Implementierung als PHP-Modul sollte sei schneller, aber ich werde es versuchen und einen Vergleich machen. – secmask

+0

Die Frage ist, ob Predis persistente Verbindungen unterstützt, da es sich um eine reine PHP-Implementierung und nicht um eine C-basierte Erweiterung handelt. Gemäß dem Betreuer unterstützt Predis persistente Verbindungen, wenn Ihre PHP-Prozesse so konfiguriert sind, dass sie resident bleiben. Dies ist typisch für ein seriöses Produktions-PHP + Apache-Setup, obwohl Ihre spezielle Installation variieren kann und eine Konfiguration erfordert. Die [Predis FAQ] (https://github.com/nrk/predis/blob/master/FAQ.markdown) weist darauf hin, dass Verbindungen persistent sind, wenn Predis persistent ist und PHP-Prozesse für Anfragen wiederverwendet werden. – kevinlawler

+0

Haftungsausschluss: Ich habe Predis noch nicht getestet. Ich versuche die C-Erweiterung zuerst, da Predis mit einem sehr ausführlichen Stil eingebaut werden soll. Ich mag es auch nicht, sich auf die Autoload-Mechanismen von PHP zu verlassen. – kevinlawler

-3

PHP-Redis unterstützt persistente Verbindungen, da es eine in C geschriebene php-Erweiterung verwendet, die ihm einen Mechanismus zum Teilen von Verbindungen zwischen Anforderungen gibt. Sehen Sie sich die Dokumentation unter popen and pconnect an.

Predis kann nicht persistente Verbindungen unterstützen, da es 100% PHP und PHP ist, teilt nichts zwischen jeder Anfrage.

+1

Nach dem Predis-Autor ist diese Antwort inkorrekt. Er behauptet, dass PHP-Anfragen Informationen austauschen könnten, wenn die PHP-Prozesse so konfiguriert sind, dass sie resident zwischen Anfragen bleiben, wie es bei vielen Implementierungen der Fall ist. – kevinlawler

+1

Einverstanden, diese Antwort ist falsch. 'popen()' ist sowieso der falsche Ressourcentyp (p == piped process). 'pconnect()' ist vollständig in der Lage Zend's interne "xport" Ressourcenbehandlung zu unterstützen, die es ermöglicht persistente Verbindungen aufrechtzuerhalten. Predis selbst verwendet [stream_socket_client()] (http://php.net/stream_socket_client) mit einem optionalen 'STREAM_CLIENT_PERSISTENT' Flag. Wenn der PHP-Prozess von etwas wie Apache mit einem Pool von Backend-Prozessen/Threads verwaltet wird, überleben diese persistenten Verbindungen innerhalb der Lebensdauer des Backends. – Joe

0

Predis unterstützt persistente Verbindungen verwendet es PhpiredisStreamConnection mit der persistent=1 Flag Syntax seit v0.8.0:

<?php 
$client = new Predis\Client('tcp://127.0.0.1?persistent=1', array(
    'connections' => array(
     'tcp' => 'Predis\Connection\PhpiredisStreamConnection', 
     'unix' => 'Predis\Connection\PhpiredisStreamConnection', 
    ), 
); 
+0

Ich habe persistant = 1 mit PhpiredisStreamConnection hinzugefügt und es sieht so aus, als ob ich immer noch den gleichen TIME_WAIT-Socket bekomme. –

2

PhpRedis derzeit persistente Verbindungen unterstützt. Mit PHP 7.0 und PhpRedis 3.0, eine ständige Verbindung mit pconnect() wie diese machen:

for ($i=0;$i<1000;$i++) { 
    $redis = new Redis(); 
    $result = $redis->pconnect('127.0.0.1'); 
    $redis->set("iterator",$i); 
    $response=$redis->get("iterator"); 
    $redis->close(); 
    unset($redis); 
} 

ist etwa 10-mal schneller (9,6 ms vs 0,83 ms pro Verbindung) als connect():

for ($i=0;$i<1000;$i++) { 
    $redis = new Redis(); 
    $result = $redis->connect('127.0.0.1'); 
    $redis->set("iterator",$i); 
    $response=$redis->get("iterator"); 
    $redis->close(); 
    unset($redis); 
} 

Hinweis: " Diese Funktion ist in Threaded-Versionen nicht verfügbar ". (Ich laufe unter IIS unter Windows, also führe ich die NTS-Version.)

0

Predis unterstützt dauerhafte Verbindung. Sie müssen nur hartnäckig wie Paramater 1.

hinzufügen Sie den Code unten

$client = new Predis\Client(array(
    'scheme' => 'tcp', 
    'host'  => '127.0.0.1', 
    'port'  => 6379, 
    'database' => 15, 
    'persistent'=> 1 
)); 

statt

$client = new Predis\Client('tcp://127.0.0.1:6379?database=15'); 

verwenden, können Sie hier weitere Parameter für die Verbindung finden können: https://github.com/nrk/predis/wiki/Connection-Parameters

Verwandte Themen