ホームページ  >  記事  >  バックエンド開発  >  純粋な PHP を使用してタイマー タスク (タイマー) を実装する方法、タイマー timer_PHP チュートリアル

純粋な PHP を使用してタイマー タスク (タイマー) を実装する方法、タイマー timer_PHP チュートリアル

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

純粋な 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 レベルのインデックスはタイムスタンプで、値はタスクの実行方法、コールバック パラメーターなどです。具体的な配列形式は次のとおりです。

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

リーリー

これはタイマー クラスのコア部分です。実行する必要があるすべてのタスクを格納する静的変数があります。なぜここが静的なのか、プロセスが SIGALRM シグナルを受け取るとトリガーされます。 signalHandler 関数を実行し、配列を順番に走査して、現時点で実行する必要があるタスクがある場合はコールバックが発生し、現在のジョブを削除するためにパラメータが渡され、ジョブを削除するかどうかを確認します。永続的なタスクである場合、現在のジョブをイベント配列に書き込み続け、次のトリガーを待ち、最後にこのタイマーがアラーム クロック信号を設定することがわかります。一度トリガーされると、内側から再びトリガーされ、自己ループの目的が達成されます。

リーリー

これは説明の便宜上、Timer クラスとコールバックがどのようなものかを見てみましょう。 リーリー

ここでは 2 つのジョブが登録されており、タイマーが実行されて無限ループでアクションがトリガーされます。それがキャプチャされない場合、事前に登録された処理関数はトリガーされません。このようなセルフループタイマーの開発が完了しました。実行結果は次のとおりです。

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

概要

1. 現在のプロセスはシグナルを受信する前に終了できません。ここでは、実際の運用環境では、次のような前提条件を作成する必要があります。サービスは常に実行されており、IO アクセスやソケット接続の待機中など、プロセスがブロックされても、現在のサービスは終了しません。常に実行されているサービス。 2. 現在、PHP は秒単位のトリガーのみをサポートしており、これより小さい時間単位はサポートしていません。スケジュールされたタスクには基本的にこれで十分です

以上がこの記事の全内容です、皆様の学習のお役に立てれば幸いです。

http://www.bkjia.com/PHPjc/1041338.html


www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/1041338.html

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