タイマー タスクは WEB アプリケーションでより一般的です。PHP を使用してタイマー タスクを実装する方法には、大きく 2 つの解決策があります: 1) Crontab コマンド、Write を使用します。シェル スクリプトを作成し、スクリプト内で PHP ファイルを呼び出し、スクリプトを定期的に実行します。 2) ブラウザなしでスクリプトを実行するには、ignore_user_abort() と set_time_limit() を一緒に使用します。前者は Linux の特性を利用しており、PHP 自体とはほとんど関係がありません。後者は使用シナリオが限られており、1 つの HTTP リクエストでのみスクリプトをトリガーし、実行後に終了します。では、純粋な PHP を使用して純粋なタイマー タスクを実装し、コグニティブ タスクのビジネス ニーズに適応するにはどうすればよいでしょうか?
基礎知識
このプログラムは Linux で開発され、cli モードで動作します 基礎知識を簡単に紹介します。
3 次元配列を使用して、実行する必要があるすべてのタスクを保存します。第 1 レベルのインデックスはタイムスタンプで、値はタスクの実行方法、コールバック パラメーターなどです。具体的な配列形式は次のとおりです。 :
リーリーこれらのタスクは、任意のクラスのメソッドにすることができます。これはスケジュールされたタスクなので、タイミングに似たものが必要です。このソリューションでは、セマフォを使用して SIGALRM 信号を現在のプロセスに毎秒送信し、信号をキャプチャし、信号処理関数をトリガーし、データをループして、信号があるかどうかを判断します。タスクの実行に必要な現在時間です。存在する場合は、コールバックを使用してそれをトリガーし、パラメーターをメソッドに渡します。 リーリー
これはタイマー クラスのコア部分です。実行する必要があるすべてのタスクを格納する静的変数があります。なぜここが静的なのか、プロセスが SIGALRM シグナルを受け取るとトリガーされます。 signalHandler 関数を実行し、配列を順番に走査して、現時点で実行する必要があるタスクがある場合はコールバックが発生し、現在のジョブを削除するためにパラメータが渡され、ジョブを削除するかどうかを確認します。永続的なタスクである場合、現在のジョブをイベント配列に書き込み続け、次のトリガーを待ち、最後にこのタイマーがアラーム クロック信号を設定することがわかります。一度トリガーされると、内側から再びトリガーされ、自己ループの目的が達成されます。 リーリー これは説明の便宜上、多くのデバッグ情報が追加されたコールバック クラスとコールバックです。使用シナリオがどのようなものかを見てみましょう。 リーリー コードは非常に短く、ここでは 2 つのジョブが登録されており、無限ループでシグナル トリガー アクションをキャプチャするためにタイマーが実行されます。キャプチャされない場合、事前に登録された処理関数はトリガーされません。このようなセルフループタイマーの実行が完了しました。実行結果は次のとおりです:
シーンクラスで追加したタスクと同じように、90で2つのタスクが実行され、1つはパラメータなしの永続ジョブ、もう1つはパラメータのある非永続ジョブで、その後、非永続ジョブは実行されなくなりました。
概要
現在のプロセスはシグナルを受信する前に終了できません。ここでは、条件が常に true であるループを使用します。たとえば、常に実行されているサービスのセットを作成する必要があります。 IOアクセスやソケット接続待ちなど、現在のサービスは終了せず、プロセスがブロックされても問題ありません。 このシナリオでは、常に実行されているサービスで使用されます。
現在、PHP は秒単位のトリガーのみをサポートしており、より短い時間単位はサポートしていません。スケジュールされたタスクには基本的にこれで十分です