一般的なタイマーは 2 つあります。1 つは定期的に実行されます (たとえば、毎日午前 3 時にレポートが発行されます)。もう 1 つは、指定された時間 (1 回) 後に実行されます (たとえば、毎日のログイン)会員がシステムにログインしてから 5 分後に発行されます。この 2 つの状況は、シェルの cron および at コマンドに対応しており、JavaScript の setInterval および setTimeout 関数に似ています (厳密に言えば、setInterval は定期的に実行され、指定された時点での実行はそれ自体で処理される必要があります)。
Web 開発を行う PHP プログラマは、JavaScript の 2 つのタイマー関数に精通しているはずです。PHP レベルに戻ると、少し面食らってしまいます:
PHP にはスリープがありますが、(組み込みの) タイマー機能は利用できません。 スリープ機能はかろうじてそれを実行できますが、プロセスがブロックされ、この期間中は他のことができなくなります (または応答しなくなります)。なぜ PHP はタイマー機能を提供しないのでしょうか?
理由
PHP が Web 開発でタイマーを使用できない根本的な理由は、制御可能な常駐メモリ操作環境が欠如しているためであると個人的に考えています。 2 つの重要なポイント: 1 つ目は常駐メモリ、2 つ目は制御可能です。 CGI モードでは、プロセスはスクリプトの実行後に直接終了し、指定された時間にタスクを実行することは期待できません。PHP-FPM モードでは、プロセスは (ほとんど) メモリ内に常駐しますが、制御できません。
制御不能とは、PHP を実行するプロセスが PHP コードの影響を受けず、プロセスのエントリ ポイントと終了タイミングが追加のプログラムによって制御されることを意味します。たとえば、FPM モードでは、PHP スクリプトの exit 関数と die 関数はスクリプトの実行を中断するだけで、スクリプトの実行プロセスに特別な影響を与えません (メモリ リークを除く)。 PHP 開発者が作成したスクリプトはプロセスの実行本体となり、実行後はプロセスの実行コンテキストからアンロードされます。この場合、PHP スクリプトの実行タイミングは依然として外部によって決定され、外部からの要求がない場合、PHP コードは何もせずにハードディスク上に静かに存在し、スケジュールされたタスクになります。
PHP は主に Web 開発を目的としているため、PHP の実行モードは安定していて信頼性が高く、開発効率が高速です。たとえば、リソースのリリース手順を省略すると、開発における多くの作業負荷や落とし穴を回避できます。タイムゾーンや文字エンコーディングなどを変更しても復元しないサードパーティのライブラリ コードについて考えてみると、常駐メモリを実行している環境では、ほぼ確実に後続のリクエストで問題が発生します。ただし、FPM モードでは、この落とし穴が意図せず解消され、デバッグ時間が大幅に節約され、プログラマがヘアラインを維持する能力に大きく貢献します。
以上がなぜphpはタイマーをサポートしていないのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。