以前は、スケジュールタスク機能を開発するたびに、オンラインで crontab を操作して新しい項目を追加する必要があったため、PHP を使用して単一プロジェクト内のタスク項目を一元管理したいと考えていました。
テーブル [id ,name,status,func,timer,last_time,created_at] を作成して、プロジェクト内のスケジュールされたタスク スクリプトを均一に保存できます。の簡単な構成により、スケジュールされた各タスクを抽象化できます。単一の入口により、単一のタスク クラスに統合されたアクセスが提供されるため、
オンライン サーバー環境を変更するオンライン コードのトラブルが軽減されます。 >
次に、いくつかの落とし穴があります。以下のような、機能的な性質によってタスクの種類がいくつか分けられるからです。
1. 1 つの実行はすぐに終了します。複数のインスタンスを同時に実行できます
2. デーモン プロセスは一度に 1 つのインスタンスのみを実行できます
2 番目のタイプでは、ロックプログラムがエラーや例外などを爆発させないようにするためのメカニズムが必要です。状況のロックが解除されていないため、この種のタスクを再度開始することはできません
この種のタスクの場合、どのように対処するかを検討する必要もあります。操作中に他の要件が変更された場合は、このタスクをすばやく簡単に終了します。
タスクが実行されるたびにロック機構が実装されていると推測されます。適用される各ロックには固定の使用量クォータがあります。
各バッチの実行が完了した後、クォータが 0 の場合は、それぞれの使用量クォータを 1 回消費する必要があります。
lock_id: $task_id
lock_{$task_id} _quota: $quota
ロックを再申請するたびに、タスク構成テーブル内のタスクの構成情報を再度読み取る必要があります。
アプリケーションが失敗した場合 (-1)、この実行を閉じて次の実行を待ちます。 このように、この種のタスクを中止したい場合は、次の 2 つのオプションを選択できます。
1. 今回は中止します。使用量クォータを -1
タスクの完了後、ロックを解放する必要があります。ロックの解放に失敗した場合は、強制的に解放するために無効なロック検出メカニズムが必要です。
重要なのは、タスク インスタンスが生きているかどうか、およびロック クォータ
強制終了後に影響はありますか?
上記は私の仮説です。フィードバックをお願いします