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 が接続をブロックすると、新しいデータがリストに到着しても再度リッスンしません。
これを機能させるには、どのような変更を加える必要がありますか?