これが私の問題です:
私のデータベースには、status フィールドを持つ requests テーブルがあります。cronjob は毎分実行され、「保留中」ステータスのすべてのリクエストを探します。リクエストの処理が完了すると、ステータスが「終了」に設定されます。
場合によっては、この cron ジョブの実行に 1 分以上かかることがあるため、同じ cron ジョブが 2 つ実行されています。彼らが同じリクエストを処理しないようにする必要があります。
今、私はこれをやっています:
$requests = db_all($this->db->query('SELECT * FROM x__mx_request WHERE status="pending"'));
//few lines of code later
$this->db->query('UPDATE x__mx_request SET status="processing" WHERE id IN('.implode(',', $ids).')');
選択した後にステータスを処理中に設定すると、他のスクリプトも処理を停止しますが、1 つのスクリプトがすべてのリクエストを選択し、2 つ目のスクリプトがすべてのリクエストを選択してから、1 つ目のスクリプトがそれらを処理中に設定することはありませんか?
これを行うためのより安全な方法が欲しいです!
編集:素晴らしい答えをありがとう、私は実際にそれらを試してみる必要がありますが、正しいものとしてマークする前に.