ホームページ  >  記事  >  バックエンド開発  >  PHPタイマーの説明

PHPタイマーの説明

不言
不言オリジナル
2018-07-06 16:31:436722ブラウズ

この記事では主に、特定の参考値を持つ PHP タイマーの説明を紹介します。今、それをあなたに共有します。必要な友達は参考にしてください。

一般的なタイマーは 2 つあります: 1 つは定期的なスケジュールされた実行です。たとえば、レポートは毎日午前 3 時に発行されます。もう 1 つは、指定された時間 (1 回) 後に実行されます。たとえば、毎日のログイン特典は、メンバーがシステムにログインしてから 5 分後に発行されます。 。この 2 つの状況は、シェルの cron および at コマンド、および JavaScript# の setInterval および setTimeout 関数に対応します。 ## 同様です(厳密には、setInterval は定期的に実行され、指定された時点での実行はそれ自身で処理する必要があります)。

Web 開発を行う PHP プログラマは、JavaScript の 2 つのタイマー関数に精通しているはずです。PHP レベルに戻ると、彼らは少し唖然とします。PHP には

sleep がありますが、そうではありません (内蔵)タイマー機能が利用可能です。 sleep 関数はかろうじてそれを実行できますが、プロセスがブロックされ、この期間中は他のことができなくなります (または応答しなくなります)。なぜ PHP はタイマー機能を提供しないのでしょうか?

理由

個人的には、PHP が Web 開発でタイマーを使用できない本質的な理由は、

制御可能な 常駐メモリ実行環境が欠如しているためであると考えています。 。 2 つの重要なポイント: 1 つ目は常駐メモリ、2 つ目は制御可能です。 CGI モードでは、プロセスはスクリプトの実行後に直接終了し、指定された時間にタスクを実行することは期待できません。PHP-FPM モードでは、プロセスは (ほとんど) メモリ内に常駐しますが、制御できません。

制御不能とは、PHP を実行するプロセスが PHP コードの影響を受けず、プロセスのエントリ ポイントと終了タイミングが追加のプログラムによって制御されることを意味します。たとえば、FPM モードでは、PHP スクリプトの

exit 関数と die 関数はスクリプトの実行を中断するだけで、スクリプトを実行するプロセスには特別な影響を与えません (ただし、メモリリークの場合)。 PHP 開発者が作成したスクリプトはプロセスの実行本体となり、実行後はプロセスの実行コンテキストからアンロードされます。この場合、PHP スクリプトの実行タイミングは依然として外部によって決定され、外部からの要求がない場合、PHP コードは何もせずにハードディスク上に静かに存在し、スケジュールされたタスクになります。

PHP は主に Web 開発を目的としているため、PHP の実行モードは安定していて信頼性が高く、開発効率が高速です。たとえば、リソースのリリース手順を省略すると、開発における多くの作業負荷や落とし穴を回避できます。タイムゾーンや文字エンコーディングなどを変更しても復元しないサードパーティのライブラリ コードについて考えてみると、常駐メモリを実行している環境では、ほぼ確実に後続のリクエストで問題が発生します。ただし、FPM モードでは、この落とし穴が意図せず解消され、デバッグ時間が大幅に節約され、プログラマがヘアラインを維持する能力に大きく貢献します。

問題は理解されました。では、PHP でスケジュールされたタスクを実行するためにタイマーを使用するにはどうすればよいでしょうか?

危険な行為

Web環境では、PHPスクリプトにはデフォルトでタイムアウトが設定されています。タイムアウト設定を削除すると、プログラムをバックグラウンドで実行し続けることができます (プロセスが終了しない場合)。たとえば、次のコードはリクエストに応答した後もバックグラウンドで実行を続け、5 秒ごとに時刻をファイルに出力します。

# test.php
set_time_limit(0); # 取消超时设置,让脚本可一直运行

echo 'This is a background run forever script. Now you can leave me alone.';

fastcgi_finish_request();   # 结束当前请求

do{
   file_put_contents("/tmp/out.dat", "test script, now:" . date("Y-m-d H:i:s") . "\n", FILE_APPEND);
   sleep(5);
}while(true);

http://localhost:8080/ をリクエストした後test.php ファイル、/tmp/out.dat ファイルを監視すると、クライアントが切断するか、ブラウザを閉じるか、コンピュータを再起動するかに関係なく、コンテンツが常に出力されていることがわかります (サーバーを再起動できません)。これは、プログラムが実行され、必要なタイマー機能が実現されたことを示しています。 sleepusleeptime_nanosleep に変更すると、マイクロ秒およびナノ秒レベルのタイマーも実装できると思いませんか?

実際には、この方法でタイマーを実装することは避けるべきです。これは非効率であるだけでなく、若干の危険があるためです。理由の 1 つは、各リクエストが 1 つのプロセスを占有し、10 万のリクエストには 10 万のプロセスが必要となるため、基本的にシステムがクラッシュしたり、後続のリクエストが応答しなくなったりすることです。また、セッションは開いているが、

session_write_close を呼び出すのを忘れると、同じユーザーからの後続のリクエストがハングします (セッションはアクティブなときはロック状態にあり、セッションを閉じることに失敗すると、後続のプロセスを開けなくなります)セッション)。

Web 開発はユーザーのリクエストにできるだけ早く応答する必要があります。このように Web 開発でタイマーを強制すると、Web アプリケーション全体が不安定になり、信頼性が低くなり、予測不能になります。孟子はこう言いました、「知って慎重に行動せよ、君子は危険な壁の下に立つものではない」信頼できない慣行は可能な限り避けるべきであり、責任転嫁や責任転嫁も避けるべきです。

次に、PHP でタイマーを使用するための正しい姿勢を見てみましょう。

正しい姿勢

PHP でタイマーを実装する方法は、次のように簡単に要約できます。

  1. cron や Jenkins などのスケジュール ツールを使用して、次のことを行います。サイクル スケジュールされたタスク (スクリプトを実行するか、特定の URL を要求する);

  2. 1 回限りの実行タスクは、メッセージ キュー、データベース、 etc;

  3. WordPress などのスケジュールされたタスクをシミュレートしますが、この方法はクライアントのリクエストに依存しており、プロセスの同時実行の問題を自分で処理する必要があることに注意してください。

  4. PHP プログラムを実行するには常駐メモリ モード、つまり CLI モードを使用します。

3 番目の方法を除く他の方法はすべて推奨されますが、実際のニーズに基づいて具体的なプランを検討してください。 PHP プログラマーとしては、もちろん、CLI モードである PHP を使用することが第一の選択です。

CLI モード

正直に言うと、CLI モードを使用すると、PHP で多くの領域を拡張できます。 CLI モードでは、プログラムのエントリ ポイントはスクリプトであり、コードはメモリ内に常駐することができ、プロセスは PHP コードによって完全に制御されます。この形式では、タイマーを実装するさまざまな方法があります。この記事では、他の人にインスピレーションを与えるためのいくつかの方法をリストします。

  1. 組み込み (高精度) を備えた swooleworkerman などのフレームワークを使用するタイマー;

  2. マルチプロセス (プール)/マルチスレッド (プール) テクノロジを使用します (pcntlpthreads 拡張は、 CLI モード);

  3. ティックやアラームなどの信号を処理する;

  4. libevent などのイベント駆動型ライブラリを使用するおよび libev;

  5. sleepループを追加するか、イベント ループを自分で実装します。

いじりたい場合は、2-5 プランを自分で使用してください。swooleworkerman# をいじりたくない場合は、 ## および他のフレームワークでは、安定性と信頼性が高く、第一の選択肢となります。

概要

HTTP リクエストとタスクの関係を区別すると、スケジュールされたタスクを簡単に実装できます。それを実装するために PHP を使用するかどうかについては、別の問題です。もちろん、Web 開発に推奨される言語である PHP は、スケジュールされたタスクを簡単に実装できます。

上記がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

PHP のクラス修飾子とアクセス修飾子

php は単に shmop 関数を使用して共有メモリを作成します。サーバー負荷

以上がPHPタイマーの説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。