PHP が Web 開発でタイマーを使用できない根本的な理由は、制御可能な常駐メモリ操作環境が欠如していることです。2 つの重要な点、1 つ目は常駐メモリ、2 つ目は制御可能です。 CGI モードでは、プロセスはスクリプトの実行後に直接終了し、指定された時間にタスクを実行することは期待できません。PHP-FPM モードでは、プロセスはメモリ内に常駐しますが、制御できません。
このチュートリアルの動作環境: Windows7 システム、PHP8 バージョン、DELL G3 コンピューター
なぜ php にはタイミングがないのですかfunction
一般的なタイマーは 2 つあり、1 つは定期的に実行される (たとえば、毎日午前 3 時にレポートが発行される)、もう 1 つは指定された時間後に (1 回だけ) 実行されます。 , たとえば、各メンバーはシステムにログインしてから 5 分後に発行されます。毎日のログイン特典。 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 でスケジュールされたタスクを実行するためにタイマーを使用するにはどうすればよいでしょうか?
危険な行為
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
ファイルを監視すると、クライアントが切断するか、ブラウザを閉じるか、コンピュータを再起動するかに関係なく、コンテンツが常に出力されていることがわかります (サーバーを再起動できません)。これは、プログラムが実行され、必要なタイマー機能が実現されたことを示しています。 sleep
を usleep
、time_nanosleep
に変更すると、マイクロ秒およびナノ秒レベルのタイマーも実装できると思いませんか?
実際には、この方法でタイマーを実装することは避けるべきです。これは非効率であるだけでなく、若干の危険があるためです。理由の 1 つは、各リクエストが 1 つのプロセスを占有し、10 万のリクエストには 10 万のプロセスが必要となるため、基本的にシステムがクラッシュしたり、後続のリクエストが応答しなくなったりすることです。また、セッションは開いているが、 session_write_close
を呼び出すのを忘れると、同じユーザーからの後続のリクエストがハングします (セッションはアクティブなときはロック状態にあり、セッションを閉じることに失敗すると、後続のプロセスを開けなくなります)セッション)。
Web 開発はユーザーのリクエストにできるだけ早く応答する必要があります。このように Web 開発でタイマーを強制すると、Web アプリケーション全体が不安定になり、信頼性が低くなり、予測不能になります。孟子はこう言いました、「知って慎重に行動せよ、君子は危険な壁の下に立つものではない」信頼できない慣行は可能な限り避けるべきであり、責任転嫁や責任転嫁も避けるべきです。
次に、PHP でタイマーを使用するための正しい姿勢を見てみましょう。
正しい姿勢
PHP でタイマーを実装する方法を簡単にまとめると、次のようになります。
cron を使用し、スケジュールを設定するJenkins などのツールは、定期的にスケジュールされたタスク (スクリプトの実行または特定の URL のリクエスト) を実行します。
1 回限りの実行タスクは、メッセージ キュー、データベース、など。サードパーティ プログラムの実行;
- #WordPress などのスケジュールされたタスクをシミュレートしますが、この方法はクライアントのリクエストに依存しており、プロセスの同時実行の問題を自分で処理する必要があることに注意してください。
- PHP プログラムを実行するには、常駐メモリ モード、つまり CLI モードを使用します。
3 番目の方法を除く他の方法はすべて推奨されますが、実際のニーズに基づいて具体的なプランを検討してください。 PHP プログラマーとしては、もちろん、CLI モードである PHP を使用することが第一の選択です。
CLI モード
正直に言うと、CLI モードを使用すると、PHP の領域を大幅に拡張できます。 CLI モードでは、プログラムのエントリ ポイントはスクリプトであり、コードはメモリ内に常駐することができ、プロセスは PHP コードによって完全に制御されます。この形式では、タイマーを実装するさまざまな方法があります。この記事では、他の人にインスピレーションを与えるためのいくつかの方法をリストします。
組み込み (高精度) を備えた
swoole
、workerman
などのフレームワークを使用するタイマー;マルチプロセス (プール)/マルチスレッド (プール) テクノロジを使用します (
pcntl
、pthreads
拡張は、 CLI モード);ティックやアラームなどの信号を処理する;
libevent
などのイベント駆動型ライブラリを使用するおよびlibev
;sleep
ループを追加するか、イベント ループを自分で実装します。
いじりたい場合は、2-5 プランを自分で使用してください。swoole
、workerman# をいじりたくない場合は、 ## および他のフレームワークでは、安定性と信頼性が高く、第一の選択肢となります。
概要
HTTP リクエストとタスクの関係を区別すると、スケジュールされたタスクを簡単に実装できます。それを実装するために PHP を使用するかどうかについては、別の問題です。もちろん、Web 開発に推奨される言語である PHP は、スケジュールされたタスクを簡単に実装できます。 推奨学習: 「PHP ビデオ チュートリアル 」
以上がなぜPHPにはタイミング関数がないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

この記事では、酸とベースのデータベースモデルを比較し、その特性と適切なユースケースを詳述しています。酸は、財務およびeコマースアプリケーションに適したデータの整合性と一貫性を優先し、ベースは可用性に焦点を当て、

この記事では、コードインジェクションのような脆弱性を防ぐために、PHPファイルのアップロードを確保することについて説明します。ファイルタイプの検証、セキュアストレージ、およびアプリケーションセキュリティを強化するエラー処理に焦点を当てています。

記事では、組み込み関数、ホワイトリストアプローチ、サーバー側の検証などの手法に焦点を当てたセキュリティを強化するためのPHP入力検証のベストプラクティスについて説明します。

この記事では、Token BucketやLeaky BucketなどのアルゴリズムやSymfony/Rate-Limiterなどのライブラリを使用するなど、PHPでAPIレート制限を実装するための戦略について説明します。また、監視、動的に調整されたレートの制限、および手をカバーします

この記事では、パスワードを保護するためにPHPでpassword_hashとpassword_verifyを使用することの利点について説明します。主な議論は、これらの関数が自動塩の生成、強力なハッシュアルゴリズム、およびSecurを通じてパスワード保護を強化するということです

この記事では、PHPおよび緩和戦略におけるOWASPトップ10の脆弱性について説明します。重要な問題には、PHPアプリケーションを監視および保護するための推奨ツールを備えたインジェクション、認証の壊れ、XSSが含まれます。

この記事では、PHPでのXSS攻撃を防ぐための戦略について説明し、入力の消毒、出力エンコード、セキュリティを向上させるライブラリとフレームワークの使用に焦点を当てています。

この記事では、PHPでのインターフェイスと抽象クラスの使用について説明し、それぞれをいつ使用するかに焦点を当てています。インターフェイスは、無関係なクラスや複数の継承に適した、実装なしで契約を定義します。抽象クラスは共通の機能を提供します


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

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

SublimeText3 中国語版
中国語版、とても使いやすい

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