ホームページ  >  記事  >  バックエンド開発  >  Pure PHP はタイマー タスク (Timer) を実装し、PHP はタイマーを実装します timer_PHP チュートリアル

Pure PHP はタイマー タスク (Timer) を実装し、PHP はタイマーを実装します timer_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 09:45:42951ブラウズ

純粋な PHP はタイマー タスク (Timer) を実装し、PHP はタイマー タイマーを実装します

タイマー タスクは WEB アプリケーションでより一般的です。PHP を使用してタイマー タスクを実装する方法には、大きく 2 つの解決策があります: 1) Crontab コマンド、Write を使用します。シェル スクリプトを作成し、スクリプト内で PHP ファイルを呼び出し、スクリプトを定期的に実行します。 2) ブラウザなしでスクリプトを実行するには、ignore_user_abort() と set_time_limit() を一緒に使用します。前者は Linux の特性を利用しており、PHP 自体とはほとんど関係がありません。後者は使用シナリオが限られており、1 つの HTTP リクエストでのみスクリプトをトリガーし、実行後に終了します。では、純粋な PHP を使用して純粋なタイマー タスクを実装し、コグニティブ タスクのビジネス ニーズに適応するにはどうすればよいでしょうか?

基礎知識

このプログラムは Linux で開発され、cli モードで動作します 基礎知識を簡単に紹介します。

  • CLI: PHP コマンドライン モード、一般的な WEB アプリケーションは fpm を使用します。
  • プロセス: プロセスはプログラム実行の基本単位であり、プロセスは相互に干渉することなく独立して実行され、各プロセスにはプロセス制御ブロックがあります。
  • プロセス間通信: プロセスは独立して実行されるため、異なるプロセス間で情報を確実に交換するためのメカニズムが必要です。主に、パイプ、IPC (共有メモリ、シグナル
  • 、メッセージキュー)、ソケットが含まれます。 ;
  • PCNTL拡張機能:主にpcntl_alarm()関数を使用するPHPのプロセス拡張機能 詳細は公式サイトを参照してください。
  • 実施原則

3 次元配列を使用して、実行する必要があるすべてのタスクを保存します。第 1 レベルのインデックスはタイムスタンプで、値はタスクの実行方法、コールバック パラメーターなどです。具体的な配列形式は次のとおりです。 :

リーリー

これらのタスクは、任意のクラスのメソッドにすることができます。これはスケジュールされたタスクなので、タイミングに似たものが必要です。このソリューションでは、セマフォを使用して SIGALRM 信号を現在のプロセスに毎秒送信し、信号をキャプチャし、信号処理関数をトリガーし、データをループして、信号があるかどうかを判断します。タスクの実行に必要な現在時間です。存在する場合は、コールバックを使用してそれをトリガーし、パラメーターをメソッドに渡します。

リーリー

これはタイマー クラスのコア部分です。実行する必要があるすべてのタスクを格納する静的変数があります。なぜここが静的なのか、プロセスが SIGALRM シグナルを受け取るとトリガーされます。 signalHandler 関数を実行し、配列を順番に走査して、現時点で実行する必要があるタスクがある場合はコールバックが発生し、現在のジョブを削除するためにパラメータが渡され、ジョブを削除するかどうかを確認します。永続的なタスクである場合、現在のジョブをイベント配列に書き込み続け、次のトリガーを待ち、最後にこのタイマーがアラーム クロック信号を設定することがわかります。一度トリガーされると、内側から再びトリガーされ、自己ループの目的が達成されます。 リーリー これは説明の便宜上、多くのデバッグ情報が追加されたコールバック クラスとコールバックです。使用シナリオがどのようなものかを見てみましょう。 リーリー コードは非常に短く、ここでは 2 つのジョブが登録されており、無限ループでシグナル トリガー アクションをキャプチャするためにタイマーが実行されます。キャプチャされない場合、事前に登録された処理関数はトリガーされません。このようなセルフループタイマーの実行が完了しました。実行結果は次のとおりです:

シーンクラスで追加したタスクと同じように、90で2つのタスクが実行され、1つはパラメータなしの永続ジョブ、もう1つはパラメータのある非永続ジョブで、その後、非永続ジョブは実行されなくなりました。

概要

現在のプロセスはシグナルを受信する前に終了できません。ここでは、条件が常に true であるループを使用します。たとえば、常に実行されているサービスのセットを作成する必要があります。 IOアクセスやソケット接続待ちなど、現在のサービスは終了せず、プ​​ロセスがブロックされても問題ありません。 このシナリオでは、常に実行されているサービスで使用されます。

現在、PHP は秒単位のトリガーのみをサポートしており、より短い時間単位はサポートしていません。スケジュールされたタスクには基本的にこれで十分です

    http://www.bkjia.com/PHPjc/1040156.html
  • www.bkjia.com
  • tru​​e
http://www.bkjia.com/PHPjc/1040156.html

技術記事 Pure PHP はタイマー タスク (Timer) を実装します。PHP はタイマー タスクを実装します。PHP を使用してタイマー タスクを実装する方法には、大きく 2 つのオプションがあります。1) 使用します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。