以前はスケジュールタスク機能を開発するたびにオンラインでcrontabを操作して項目を追加する必要があったので、PHPを使ってタスク項目を一つのプロジェクト内で一元管理したい
テーブル[id]を作成できます。 、name、status、func、timer、last_time、created_at] を使用して、計画されたタスク スクリプトをプロジェクト内に均一に保存できます。簡単な構成により、計画された各タスクを単純なタスク クラスに抽象化し、crontab で構成された単一の入り口を通じて均一にアクセスできます。
オンライン サーバー環境に合わせてコードを変更する手間が軽減されます。次に、次のような機能の性質によっていくつかの種類のタスクが分類される可能性があるため、ここにはいくつかの落とし穴があります。
1. 単一の実行、即時に終了、複数のインスタンスを同時に実行可能
2. デーモン プロセスは同時に 1 つのインスタンスのみを実行可能
2 番目のタイプの場合、ロック メカニズムが必要です。エラーや例外などによりプログラムがロック解除されるのを防ぎます。その結果、この種のタスクを再度開始することはできません
この種のタスクについては、他の要件がある場合にこのタスクを迅速かつ便利に終了する方法も考慮する必要があります操作中に変更します
ロックメカニズムはタスクIDを通じて実装されており、タスクが実行されるたびにロックを申請する必要があります。申請される各ロックには固定の使用量割り当てがあります
。各バッチの実行後に使用量クォータが 1 回消費されます。クォータが 0 になると、システムからロックを再申請する必要があります。
ロックを再申請するたびに、タスク構成テーブル内のタスクの構成情報を再度読み取る必要があります
アプリケーションが失敗した場合 (-1 )、この実行を閉じて次の実行を待ちますこのように、この種のタスクを中止するには、次の 2 つのオプションがあります:
1. 今回中止するには、その使用量クォータを -1 に設定するだけです。
2、ステータスをリセットします。このタスクを無効にして、使用量クォータを -1 にリセットします
タスクの完了後、ロックを解放する必要があります。ロックの解放に失敗した場合は、解放を強制するために無効なロック検出メカニズムが必要です
。
無効なロックの判定:
重要なのは、タスクインスタンスが生きているかどうか、およびロッククォータが1未満であるかどうかを判定する方法です。無効なロックであると判定できるか?ロックを再申請しています
が無効なロック検出メカニズムによって付与されています
削除した後に何か影響はありますか?