検索
ホームページバックエンド開発PHPチュートリアルPHP タイマーについて話しましょう

PHP タイマーについて話しましょう

Sep 15, 2021 pm 02:47 PM
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 でタイマーを実装する方法は、次のように簡単に要約できます。

    cron や Jenkins などのスケジュール ツールを使用して、定期的にスケジュールされたタスクを実行する(スクリプトを実行することも、特定の URL を要求することもできます);
  1. ワンタイム実行タスクは、メッセージ キューやデータベースなどを介して実行するサードパーティ プログラムに配信されます。;
  2. シミュレーションWordPress のスケジュールされたタスクと同様ですが、このメソッドはクライアントのリクエストに依存しており、プロセスの同時実行の問題を単独で処理する必要があることに注意してください。
  3. PHP プログラムを実行するには常駐メモリ モード、つまり CLI モードを使用します。
3 番目の方法を除く他の方法はすべて推奨されますが、実際のニーズに基づいて具体的なプランを検討してください。 PHP プログラマーとしては、もちろん、CLI モードである PHP を使用することが第一の選択です。

CLI モード

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

  1. 組み込み (高精度) タイマーを備えた swooleworkerman などのフレームワークを使用します。
  2. # #マルチプロセス (プール)/マルチスレッド (プール) テクノロジーを使用します (
  3. pcntlpthreads 拡張機能は CLI モードでのみ使用できます);
  4. ティックやアラームなどの処理シグナル;
  5. libevent
  6. libev およびその他のイベント駆動型ライブラリを使用します;
  7. sleep
  8. ループを追加するか、イベント ループを自分で実装します。
  9. これをいじりたい場合は、自分で 2-5 プランを使用してください。
swoole

workerman、および をいじりたくない場合は、他のフレームワークの場合は、安定性と信頼性が高く、第一の選択肢となります。

概要

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

推奨学習: 「

PHP ビデオ チュートリアル

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

声明
この記事はtlanyanで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
セッションを保存するためにデータベースを使用することの利点は何ですか?セッションを保存するためにデータベースを使用することの利点は何ですか?Apr 24, 2025 am 12:16 AM

データベースストレージセッションを使用することの主な利点には、持続性、スケーラビリティ、セキュリティが含まれます。 1。永続性:サーバーが再起動しても、セッションデータは変更されないままになります。 2。スケーラビリティ:分散システムに適用され、セッションデータが複数のサーバー間で同期されるようにします。 3。セキュリティ:データベースは、機密情報を保護するための暗号化されたストレージを提供します。

PHPでカスタムセッション処理をどのように実装しますか?PHPでカスタムセッション処理をどのように実装しますか?Apr 24, 2025 am 12:16 AM

PHPでのカスタムセッション処理の実装は、SessionHandlerInterfaceインターフェイスを実装することで実行できます。具体的な手順には、次のものが含まれます。1)CussentsessionHandlerなどのSessionHandlerInterfaceを実装するクラスの作成。 2)セッションデータのライフサイクルとストレージ方法を定義するためのインターフェイス(オープン、クローズ、読み取り、書き込み、破壊、GCなど)の書き換え方法。 3)PHPスクリプトでカスタムセッションプロセッサを登録し、セッションを開始します。これにより、データをMySQLやRedisなどのメディアに保存して、パフォーマンス、セキュリティ、スケーラビリティを改善できます。

セッションIDとは何ですか?セッションIDとは何ですか?Apr 24, 2025 am 12:13 AM

SessionIDは、ユーザーセッションのステータスを追跡するためにWebアプリケーションで使用されるメカニズムです。 1.ユーザーとサーバー間の複数のインタラクション中にユーザーのID情報を維持するために使用されるランダムに生成された文字列です。 2。サーバーは、ユーザーの複数のリクエストでこれらの要求を識別および関連付けるのに役立つCookieまたはURLパラメーターを介してクライアントに生成および送信します。 3.生成は通常、ランダムアルゴリズムを使用して、一意性と予測不可能性を確保します。 4.実際の開発では、Redisなどのメモリ内データベースを使用してセッションデータを保存してパフォーマンスとセキュリティを改善できます。

ステートレス環境(APIなど)でセッションをどのように処理しますか?ステートレス環境(APIなど)でセッションをどのように処理しますか?Apr 24, 2025 am 12:12 AM

APIなどのステートレス環境でのセッションの管理は、JWTまたはCookieを使用して達成できます。 1。JWTは、無国籍とスケーラビリティに適していますが、ビッグデータに関してはサイズが大きいです。 2.cookiesはより伝統的で実装が簡単ですが、セキュリティを確保するために慎重に構成する必要があります。

セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?Apr 23, 2025 am 12:16 AM

セッション関連のXSS攻撃からアプリケーションを保護するには、次の測定が必要です。1。セッションCookieを保護するためにHTTPonlyとセキュアフラグを設定します。 2。すべてのユーザー入力のエクスポートコード。 3.コンテンツセキュリティポリシー(CSP)を実装して、スクリプトソースを制限します。これらのポリシーを通じて、セッション関連のXSS攻撃を効果的に保護し、ユーザーデータを確保できます。

PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?Apr 23, 2025 am 12:13 AM

PHPセッションのパフォーマンスを最適化する方法は次のとおりです。1。遅延セッション開始、2。データベースを使用してセッションを保存します。これらの戦略は、高い並行性環境でのアプリケーションの効率を大幅に改善できます。

session.gc_maxlifetime構成設定とは何ですか?session.gc_maxlifetime構成設定とは何ですか?Apr 23, 2025 am 12:10 AM

thesession.gc_maxlifettinginttinginphpdethinesthelifsessessiondata、setinseconds.1)it'sconfiguredinphp.iniorviaini_set()。 2)AbalanceSneededToAvoidPerformanceIssues andunexpectedLogouts.3)php'sgarbagecollectionisisprobabilistic、影響を受けたBygc_probabi

PHPでセッション名をどのように構成しますか?PHPでセッション名をどのように構成しますか?Apr 23, 2025 am 12:08 AM

PHPでは、session_name()関数を使用してセッション名を構成できます。特定の手順は次のとおりです。1。session_name()関数を使用して、session_name( "my_session")などのセッション名を設定します。 2。セッション名を設定した後、session_start()を呼び出してセッションを開始します。セッション名の構成は、複数のアプリケーション間のセッションデータの競合を回避し、セキュリティを強化することができますが、セッション名の一意性、セキュリティ、長さ、設定タイミングに注意してください。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。