1

Redis を使用してメッセージ キューを構築しようとしています。クライアントが新しいデータを送信するたびに、リストに追加されます。

これがそのコードです

$client->lPush("my_queue", $data);

現在、新しく到着したデータをポップして処理する別のスクリプトslave.phpがあります。slave.php のコード

while (true) {
   list($queue, $message)  = $client->brPop(["my_queue"], 0);

    /*
    Logic to process the data
    */
}

slave.php が Apache で開始および停止するように、Apache の起動スクリプトを変更しました。それはうまくいきます。しかし、数分待った後、brPop はリッスンを停止し、次のようなエラー メッセージが表示されます。

Uncaught exception 'Predis\Connection\ConnectionException' with message 'Error while reading line from the server [tcp://127.0.0.1:6379]' in /var/www/api/lib/predis-0.8/lib/Predis/Connection/AbstractConnection.php:139
Stack trace:
#0 /var/www/api/lib/predis-0.8/lib/Predis/Connection/StreamConnection.php(205): Predis\Connection\AbstractConnection->onConnectionError('Error while rea...')
#1 /var/www/api/lib/predis-0.8/lib/Predis/Connection/AbstractConnection.php(128): Predis\Connection\StreamConnection->read()
#2 /var/www/api/lib/predis-0.8/lib/Predis/Connection/AbstractConnection.php(120): Predis\Connection\AbstractConnection->readResponse(Object(Predis\Command\ListPopLastBlocking))
#3 /var/www/api/lib/predis-0.8/lib/Predis/Client.php(227): Predis\Connection\AbstractConnection->executeCommand(Object(Predis\Command\ListPopLastBlocking))
#4 /var/www/api/lib/slave.php(7): Predis\Client->__call('brPop', Array)
#5 /var/www/api/lib/slave.php(7): Predis\Client->brPop(Array, 0)
#6 {main}
 thrown in /var/www/api/lib/predis-0.8/lib/Predis/Connection/AbstractConnection.php on line 139

ドキュメントによると、リストが空の場合、別のクライアントがキーの 1 つに対して LPUSH または RPUSH 操作を実行するまで、BLPOP/BRPOP は接続をブロックします。しかし、これは私の場合には起こりません。私の場合、brpop が接続をブロックすると、新しいデータがリストに到着しても再度リッスンしません。

これを機能させるには、どのような変更を加える必要がありますか?

4

3 に答える 3

1

現在は機能していますが、これが正しい方法であるかどうかはわかりません。現在、エラーをキャッチし、接続に失敗した場合に関数を再帰的に呼び出しています。私の新しいslave.phpは次のようになります:

function process_data()
{
    try {
        $client = new \Predis\Client();

        require_once("logger.php");

        while (true) {
            list($queue, $message) = $client->brPop(["bookmark_queue"], 0);
            // logic
        }
    } catch (Exception $ex) {
        $error = $ex->getMessage();
        log_error($error, "slave.php");
        process_data(); // call the function recursively if connection fails
    }
}
process_data(); // call the function
于 2014-01-08T06:20:49.040 に答える
0

?read_write_timeout=-1接続文字列に追加します。

于 2016-11-28T11:34:43.477 に答える