2016-04-11 7 views
1

Ich baue Chat-Nachrichtensystem lange Umfrage verwenden BLPOP. Ich habe Predis PHP verwendet. Wenn ich renne test/get -> es läuft okie mit 30s Timeout.Brauchen Sie Unterstützung über BLPOP Predis PHP

Während ich test/get läuft, versuche ich Daten durch test/push zu schieben, aber es hat ein Problem. Push wird nicht sofort ausgeführt, wenn test/get nicht beendet ist. test/push dauert 30s.

Ich benutze Kommandozeile, um Daten zu schieben: RPUSH message:test hello -> Es führt sofort und sehr schön.

require './vendor/autoload.php'; 

class Test extends CI_Controller { 
public $keyChat = 'message:test'; 
public function __construct() { 
    parent::__construct(); 
} 

public function push() { 
    $redis = new Predis\Client(['host' => 'localhost','port' => 6379]); 
    $redis->rpush($this->keyChat, 'hello you'); 
    $redis->expire($this->keyChat, 3600); 
    echo "send message success"; 
} 

    public function get() { 
     $redis = new Predis\Client(['host' => '127.0.0.1','port' => 6379]); 
     $res = $redis->blpop($this->keyChat, 30); 
     var_dump($res); 
    } 
} 

Antwort

1

Wenn Sie die BLPOP Dokumentation überprüft, werden Sie feststellen, dass es eine Sperroperation ist, nehme ich an, dass Sie durch Instanziieren eines anderen Redis-Client zu schieben versuchen, so kann BLPOP den Wert finden und sie zurückbringen.

Die 30 Sekunden Ausgabe ist das Timeout für BLPOP wie in entsperren:

$redis->blpop($this->keyChat, 30);

Das funktioniert es Grund, wenn Sie es von der Kommandozeile drücken ist, dass es eine andere Verbindung ist, dass ich Ich bin mir nicht sicher im Fall von Predis, aber ich denke, die gleiche Verbindung wird zurückgegeben, wenn Sie versuchen, RPUSH, deshalb gibt es Ihnen dieses Problem.

Verwandte Themen