この記事では主に、特定の参考値を持つ PHP タイマーの説明を紹介します。今、それをあなたに共有します。必要な友達は参考にしてください。
一般的なタイマーは 2 つあります: 1 つは定期的なスケジュールされた実行です。たとえば、レポートは毎日午前 3 時に発行されます。もう 1 つは、指定された時間 (1 回) 後に実行されます。たとえば、毎日のログイン特典は、メンバーがシステムにログインしてから 5 分後に発行されます。 。この 2 つの状況は、シェルの cron
および at
コマンド、および JavaScript# の
setInterval および
setTimeout 関数に対応します。 ## 同様です(厳密には、
setInterval は定期的に実行され、指定された時点での実行はそれ自身で処理する必要があります)。
sleep がありますが、そうではありません (内蔵)タイマー機能が利用可能です。
sleep 関数はかろうじてそれを実行できますが、プロセスがブロックされ、この期間中は他のことができなくなります (または応答しなくなります)。なぜ PHP はタイマー機能を提供しないのでしょうか?
制御可能な 常駐メモリ実行環境が欠如しているためであると考えています。 。 2 つの重要なポイント: 1 つ目は常駐メモリ、2 つ目は制御可能です。 CGI モードでは、プロセスはスクリプトの実行後に直接終了し、指定された時間にタスクを実行することは期待できません。PHP-FPM モードでは、プロセスは (ほとんど) メモリ内に常駐しますが、制御できません。
制御不能とは、PHP を実行するプロセスが PHP コードの影響を受けず、プロセスのエントリ ポイントと終了タイミングが追加のプログラムによって制御されることを意味します。たとえば、FPM モードでは、PHP スクリプトのexit 関数と
die 関数はスクリプトの実行を中断するだけで、スクリプトを実行するプロセスには特別な影響を与えません (ただし、メモリリークの場合)。 PHP 開発者が作成したスクリプトはプロセスの実行本体となり、実行後はプロセスの実行コンテキストからアンロードされます。この場合、PHP スクリプトの実行タイミングは依然として外部によって決定され、外部からの要求がない場合、PHP コードは何もせずにハードディスク上に静かに存在し、スケジュールされたタスクになります。
# 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 ファイルを監視すると、クライアントが切断するか、ブラウザを閉じるか、コンピュータを再起動するかに関係なく、コンテンツが常に出力されていることがわかります (サーバーを再起動できません)。これは、プログラムが実行され、必要なタイマー機能が実現されたことを示しています。
sleep を
usleep、
time_nanosleep に変更すると、マイクロ秒およびナノ秒レベルのタイマーも実装できると思いませんか?
session_write_close を呼び出すのを忘れると、同じユーザーからの後続のリクエストがハングします (セッションはアクティブなときはロック状態にあり、セッションを閉じることに失敗すると、後続のプロセスを開けなくなります)セッション)。
正直に言うと、CLI モードを使用すると、PHP で多くの領域を拡張できます。 CLI モードでは、プログラムのエントリ ポイントはスクリプトであり、コードはメモリ内に常駐することができ、プロセスは PHP コードによって完全に制御されます。この形式では、タイマーを実装するさまざまな方法があります。この記事では、他の人にインスピレーションを与えるためのいくつかの方法をリストします。
組み込み (高精度) を備えた swoole
、workerman
などのフレームワークを使用するタイマー;
マルチプロセス (プール)/マルチスレッド (プール) テクノロジを使用します (pcntl
、pthreads
拡張は、 CLI モード);
ティックやアラームなどの信号を処理する;
libevent
などのイベント駆動型ライブラリを使用するおよび libev
;
sleep
ループを追加するか、イベント ループを自分で実装します。
いじりたい場合は、2-5 プランを自分で使用してください。swoole
、workerman# をいじりたくない場合は、 ## および他のフレームワークでは、安定性と信頼性が高く、第一の選択肢となります。
php は単に shmop 関数を使用して共有メモリを作成します。サーバー負荷
以上がPHPタイマーの説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。