0

タスクを処理するために使用する PHP のメッセージ キューがあります。タスクを挿入するときにバグが発生し、ブール値の束が挿入されました (通常はオブジェクトを渡します)。

アイテムが削除されていないためにハングしたため、キューを読み取るプロセスを強制終了しました。

かなり長い間うまく機能している私の典型的なコードは次のとおりです。

    $mqst = msg_stat_queue($mqh);

    while ($mqst['msg_qnum']) {
        output('Queue is populated', O_DEBUG);
        msg_receive($mqh, 0, $msgtype, 2048, $data, true);
        $mqst = msg_stat_queue($mqh);
        if ($data instanceof \Core\Image) {
            $new_tasks[] = $data;
        } else {
            output('Got some odd data.. ' . print_r($data, true), O_ERROR);
        }
    }

私の端末から:

$ php -r '$mqh = msg_get_queue(12345, 0666);
          $mqst = msg_stat_queue($mqh); 
          $i = $mqst["msg_qnum"]; while ($i--) {
             msg_receive($mqh, 0, $type, 2048, $data, true);
             var_dump($type, $data); 
          }'

出力:

int(0)
bool(false)
int(0)
bool(false)
int(0)
bool(false)
int(0)
bool(false)
int(0)
bool(false)
int(0)
bool(false)
int(0)
bool(false)

これを無期限に繰り返すことができます。彼らは動揺していません。キューを削除しようとしましたが、成功しませんでした。ドキュメントには次のように記載されています。

msg_remove_queue() は、キューによって指定されたメッセージ キューを破棄します。この関数は、すべてのプロセスがメッセージ キューの処理を終了し、メッセージ キューが保持しているシステム リソースを解放する必要がある場合にのみ使用してください。

ただし、プロセスを強制終了しましたが、リソースの解放についてはあまり具体的ではありません。メッセージを受信した後、メッセージがキューから取り出されない理由がわかりません。おそらく私は単純なものを見逃しています

4

1 に答える 1

-2

編集この答えは間違っていました。

質問を詳しく調べた結果、次のような問題があると思います。キュー内の最初のメッセージが 2048 バイトを超えているためmsg_receive、エラーが返されます。このため、メッセージがキューから削除されることはなく、そのまま残ります。

関数の次の呼び出しでは、同じエントリを取得しようとするため、再び失敗します。

msg_receive関数を while ループの条件にするという私の最初の提案は、これをすぐに明らかにしたでしょう。(それが本当に解決策である場合)。

解決策MSG_NOERROR: とりあえず、関数にフラグを追加してmsg_receive、次のメッセージが実際に大きすぎるかどうかを確認し、そこからデバッグします。

于 2012-08-18T22:07:27.190 に答える