0 レビュー
3 回答
php-redisを使用したメッセージキューの実装エラー、BLPOPの使用エラー
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
ドキュメントによると、リストが空の場合、BLPOP / BRPOPは、別のクライアントがキーの1つに対してLPUSHまたはRPUSH操作を実行するまで接続をブロックします。
しかし、私の場合、これは起こっていません。
私の場合、brpopが接続をブロックすると、新しいデータがリストに到着しても、brpopは再度リッスンしません。
これを機能させるにはどのような変更を加える必要がありますか?
わからない
0
レビュー
答え :
解決策:
問題はRedis構成にありませんが、 php.ini
設定を変更して設定する必要があります
default_socket_timeout = 90 //Or whatever you would like to set
最大ソケットタイムアウトに達したときにソケットを切断するのはPHPです。
わからない
0
レビュー
答え :
解決策:
現在は機能していますが、これを行うのに適切な方法かどうかはわかりません。現在、エラーをキャッチし、接続障害が発生した場合に関数を再帰的に呼び出しています。私の新しい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
わからない
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。