以下では、PHPスケジュール実行タスクの実装方法を、理論的な説明、分析例、効果の表示を通じて共有します。
タイマー タスクは WEB アプリケーションで一般的です。PHP を使用してタイマー タスクを実装する方法には、大きく 2 つのオプションがあります。
1) Crontab コマンドを使用してシェル スクリプトを作成し、スクリプト内で PHP ファイルを呼び出し、スクリプトを定期的に実行します。 2) スクリプトをブラウザ外で実行するには、ignore_user_abort() と set_time_limit() を一緒に使用します。
前者は Linux の特性を利用しており、PHP 自体とはほとんど関係がありません。後者は使用シナリオが限られており、1 つの HTTP リクエストでのみスクリプトをトリガーし、実行後に終了できます。では、純粋な PHP を使用して純粋なタイマー タスクを実装し、コグニティブ タスクのビジネス ニーズに適応するにはどうすればよいでしょうか?
基礎知識このプログラムは Linux で開発され、cli モードで実行されます。 ここでは基礎知識を簡単に紹介します。
CLI: PHP コマンド ライン モード、一般的な WEB アプリケーションは fpm を使用します。 プロセス: プロセスは、相互に干渉することなく独立して実行されます。各プロセスには、独立したプロセス制御ブロックがあります。 プロセス間通信: プロセスは独立して実行されるため、プロセス間通信には主にパイプ、IPC (共有メモリ、シグナル、メッセージ キュー)
が含まれます。 PCNTL 拡張機能: 主に
pcntl_alarm() 関数を使用した PHP のプロセス拡張機能。詳細は公式 Web サイトを参照してください。
実施原則
3 次元配列を使用して、実行する必要があるすべてのタスクを保存します。第 1 レベルのインデックスはタイムスタンプで、値はタスクの実行方法、コールバック パラメーターなどです。具体的な配列形式は次のとおりです。
配列(
'1438156396' =>
array(1,array('Class','Func'), array(), true),
)
)
説明:
1438156396 タイムスタンプ
コードは次のとおりです:
array(1,array('Class','Func'), array(), true)
パラメータは次に表します: 実行時間間隔、コールバック関数、コールバック関数に渡されるパラメータ、永続化するかどうか (true は常にデータに保存され、それ以外の場合は 1 回の実行後に削除されます)
これらのタスクは、任意のクラスのメソッドにすることができます。これはスケジュールされたタスクなので、タイミングに似たものが必要です。このソリューションでは、セマフォを使用して SIGALRM 信号を現在のプロセスに毎秒送信し、信号をキャプチャし、信号処理関数をトリガーし、データをループして、信号があるかどうかを判断します。タスクの実行に必要な現在時間です。その場合は、コールバックを使用してそれをトリガーし、パラメーターをメソッドに渡します。
リーリー
これはタイマー クラスの中核部分であり、実行する必要があるすべてのタスクを格納する静的変数があります。プロセスが SIGALRM シグナルを受け取るときは、自分で考えてください。がトリガーされ、配列が順次走査され、現時点で実行する必要があるタスクがある場合はコールバックが発生し、パラメータが渡されて現在のジョブを削除し、実行するかどうかがチェックされます。永続的なタスクである場合、現在のジョブをイベント配列に書き込み続け、次のトリガーを待ち、最後にこのタイマーが現在のプロセスの設定を設定することがわかります。一度トリガーされると、内側から再びトリガーされ、自己ループの目的が達成されます。
リーリー
これは説明の便宜上、多くのデバッグ情報が追加されたコールバック クラスとコールバックです。使用シナリオがどのようなものかを見てみましょう。
コードは非常に短く、ここでは 2 つのジョブが登録され、無限ループでシグナルトリガーアクションをキャプチャするために、事前に登録された処理関数がトリガーされません。このようなセルフループタイマーが完了しました。実行結果は次のとおりです。
シーン クラスによって追加されたタスクと同様に、2 つのタスクが 90 で実行されました。1 つはパラメーターのない永続ジョブで、もう 1 つはパラメーターのある非永続ジョブでした。その後、非永続ジョブは実行されなくなりました。
現在のプロセスはシグナルを受信する前に終了できません。ここでは、条件が常に true であるループを使用します。たとえば、常に実行されている一連のサービスを作成する必要があります。 IOアクセスやソケット接続待ちなど、現在のサービスは終了せず、プロセスがブロックされても問題ありません。 このシナリオでは、常に実行されているサービスで使用されます。
現在、PHP は秒単位のトリガーのみをサポートしており、より短い時間単位はサポートしていません。基本的に、スケジュールされたタスクにはこれで十分です
以上がこの記事の全体的な紹介です。皆さんに気に入っていただければ幸いです。