タスクを処理するために使用する 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() は、キューによって指定されたメッセージ キューを破棄します。この関数は、すべてのプロセスがメッセージ キューの処理を終了し、メッセージ キューが保持しているシステム リソースを解放する必要がある場合にのみ使用してください。
ただし、プロセスを強制終了しましたが、リソースの解放についてはあまり具体的ではありません。メッセージを受信した後、メッセージがキューから取り出されない理由がわかりません。おそらく私は単純なものを見逃しています