ホームページ  >  記事  >  PHPフレームワーク  >  ThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能

ThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能

咔咔
咔咔オリジナル
2020-12-29 11:07:151826ブラウズ
#”この記事では、コントローラーの最終実行プロセスと使用される 2 つの高度な属性について簡単に説明します。1 つは fastcgi_finish_request メソッドの賢い使用法で、もう 1 つは特性機能です。スーパークラス 概念はある程度理解できたので、一緒に分析しましょう。

#1. 端末へのデータ出力方法

##コントローラー内のメソッドが実行されると、Appクラスのrunメソッドに応答データが送信され、ここまでで実行が完了します。

ここのデータが最終的にどこに返されるかについて少し混乱していますか?

ThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能アプリケーションの実行

したがって、run メソッドが実行されると、対応する結果がここに返されます。

コードのこの部分Container::get('app')これは、次のインスタンスを返すことをご存知でしょう。アプリクラス。

次に、App クラスを介して run メソッドを実行すると、前述のすべてが得られます。

下の写真は、Kaka が作成した腰の真ん中からのマインド マップです。前部分は存在せず、後ろの知識ポイントはすべてこのマインド マップに書き込まれます。

ThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能

runメソッド実行後、実行されますContainer::get('app' )- >run()->send()send メソッド、send メソッドが App クラスで実行されると考える人はどのくらいいるでしょうか。

実際にはそうではありません。以前にコントローラー メソッドを実行した後に返された応答結果を思い出してください。

あまり大まかに見なければ、これが Response のオブジェクト インスタンスであることがわかります。

したがって、send メソッドは応答クラスで実行されます。

ThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能

最初に他のものを見るのではなく、最初にこのコード行を見てください$this-&gt ;app['hook']、どこで実行されるかわかりましたか?

このフォームは、以前に解析された ArrayAccess クラスである配列フォームにアクセスすることで、オブジェクトのプロパティにアクセスします。アクセスした属性が存在しない場合は、offsetGetを実行し、マジックメソッド__getを実行し、最後にmakeメソッドでインスタンスを返すという一連の操作がコンテナ内で行われます。

このコード行が具体的に何を監視しているのかについては分析しません。

次に、出力データを処理するコード行を確認する必要があります。$data = $this->getContent();

このメソッドの機能は次のとおりです。 Data を渡すには、このクラスの content 属性に割り当てられます。

ThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能

実際、この出力データの取得方法ですが、最初のKakaの丸で囲ったところを見てください。あまり必要性を感じません。

データの処理がまったく行われておらず、ただ返されていることがわかります。したがって、このフレームワークには良い点と悪い点があります。読んだ場合のみわかります。読まないと間違っています。普段使っているツールについては何も知りません。

ThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能

次のステップは、トレース デバッグ インジェクションです。これは、構成ファイルを通じて構成され、デバッグを呼び出すことによって実装されます。ここでは詳しく説明しません。

続いてキャッシングの判定ですが、キャッシングについては次の記事で別途説明するのでこれもパスします。

次のステップは、応答ヘッダーを設定し、HTTP ヘッダーが送信されたかどうかを検出することです。これは非常に重要ですが、あまり公開されることのない知識ポイントでもあります。

  • headers_sent(): HTTP ヘッダーが送信されたかどうかを確認します
  • http_response_code(): 応答の HTTP ステータス コードを取得/設定します
  • header: この関数は、生の HTTP ヘッダーをクライアントに送信します。

ThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能

最後のステップ、もうすぐです、もうすぐですこれは echo を備えており、メソッド

$this->sendData($data);

を実行して、義理の娘が母親になったような感覚を人々に与えました。ようやく到着したターミナルでは、数十日分の悲しみを伝えるエコーが流れた!

このエコーカカに到達するまでに、私は9、99、81の困難を経験しました。戦いはまだ終わっていない、仲間たちはまだ頑張らなければなりません!

ThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能

したがって、ここではフレームワークの実行、次にアプリケーションの初期化、次にルート検出とコントローラーのインスタンスを作成し、応答インスタンスを返し、エントリー ファイルを介して send メソッドを実行します。

最後にデータを端末に出力します。これはエコー処理です。

ここでの戦いは終わりましたが、以下に非常に重要な知識ポイントがまだ残っており、カカがそれについて再度言及して説明します。

2. fastcgi_finish_request メソッドの賢い使い方

前で Container::get('app')-&gt を渡しました。 Section ;run()->send();レスポンスクラスでsendメソッドが実行され、データが出力されます。

しかし、データを出力した後、メソッド fastcgi_finish_request(); も実行されます。コメントは、ページの応答を改善するためです。謎を詳しく見てみましょう。

PHP 公式 Web サイトのこの文章を参照してください。

スクリプトは、fastcgi_finish_request() の後も FPM プロセスを占有します。そのため、長時間実行されるタスクに過度に使用すると、午後までのすべての FPM スレッドを占有する可能性があります。 .max_children。これにより、Web サーバーでゲートウェイ エラーが発生します。

fastcgi_finish_request() の後、スクリプトは引き続き FPM プロセスを占有します。そのため、長時間実行されるタスクでこれを過度に使用すると、すべての FPM スレッドが pm.max_children まで拘束される可能性があります。これにより、Web サーバーでゲートウェイ エラーが発生します。

したがって、この方法を十分に理解していない場合は、自分のプロジェクトでこの方法を使用しないでください。

次に、Kaka はケースを使用してこのメ​​ソッドの使用法をデモンストレーションします。これは単なるデモンストレーションです。プロジェクトで使用する必要がある場合は、ドキュメントをよく読み、問題点に注意してください。

ケースデモンストレーション

この会社はユーザーに通知を送信する必要があるビジネスを持っていますが、送信時間が長すぎるため、非常に時間がかかり、問題が発生する可能性があります。数十秒かかりますが、さらに深刻な問題としては、ブラウザ接続のタイムアウトが直接発生する可能性があります。

問題の 1 つはユーザー エクスペリエンスであり、ユーザーの待ち時間の処理は当然ながら良くありません。

上記 2 つの問題を解決するには、今日説明した fastcgi_finish_request が役に立ちます。 #########理解する######

この関数の実際の理解は、ブラウザに応答を送信することです。ユーザーの待ち時間は大幅に短縮されますが、PHP プロセスは引き続き実行されます。

これにより、私たちがよく話題にする非同期実行と似た目的が達成されます。

直感的には、メールの送信には 10 秒かかるかもしれませんが、ユーザーはそれに気づきません。ユーザーがクリックしてメールを送信すると、送信が成功したことを示すブラウザーの応答が直接返されます。終了すると、ユーザーは他のことを行い、バックグラウンド プロセスが続行され、電子メールの送信タスクを実行します。

#ケース

ThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能

##デモケース
<span style="display: block; background: url("https://files.mdnice.com/point.png") 10px 10px / 40px no-repeat rgb(40, 44, 52); height: 30px; width: 444.812px; margin-bottom: -7px; border-radius: 5px;"></span><code class="hljs" style="overflow-x: auto; padding: 15px 16px 16px; color: rgb(171, 178, 191); display: -webkit-box; font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace; font-size: 12px; background: rgb(40, 44, 52); border-radius: 5px;"><span class="hljs-meta" style="color: rgb(97, 174, 238); line-height: 26px;"><?php</span><br/><span class="hljs-comment" style="color: rgb(92, 99, 112); font-style: italic; line-height: 26px;">/**<br/> * 设置超时时间,变成不限制<br/> *<br/> */</span><br/>set_time_limit(<span class="hljs-number" style="color: rgb(209, 154, 102); line-height: 26px;">0</span>);<br/><br/><span class="hljs-comment" style="color: rgb(92, 99, 112); font-style: italic; line-height: 26px;">/**<br/> * 本函数模拟非常耗时的任务,执行完毕需要5秒的时间<br/> */</span><br/><span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: rgb(198, 120, 221); line-height: 26px;">function</span> <span class="hljs-title" style="color: rgb(97, 174, 238); line-height: 26px;">writeFile</span><span class="hljs-params" style="line-height: 26px;">()</span><br/></span>{<br/>    $path = <span class="hljs-string" style="color: rgb(152, 195, 121); line-height: 26px;">&#39;D:/phpstudy_pro/WWW/kaka.txt&#39;</span>;<br/>    file_put_contents($path,<span class="hljs-string" style="color: rgb(152, 195, 121); line-height: 26px;">&#39;程序运行开始&#39;</span> . PHP_EOL,FILE_APPEND);<br/>    <span class="hljs-keyword" style="color: rgb(198, 120, 221); line-height: 26px;">for</span>($i =<span class="hljs-number" style="color: rgb(209, 154, 102); line-height: 26px;">0</span>;$i < <span class="hljs-number" style="color: rgb(209, 154, 102); line-height: 26px;">5</span>;$i++) {<br/>        file_put_contents($path,time() . PHP_EOL,FILE_APPEND);<br/>        sleep(<span class="hljs-number" style="color: rgb(209, 154, 102); line-height: 26px;">1</span>);<br/>    }<br/><br/>    file_put_contents($path,<span class="hljs-string" style="color: rgb(152, 195, 121); line-height: 26px;">&#39;程序运行结束&#39;</span> . PHP_EOL,FILE_APPEND);<br/><br/>}<br/><br/><span class="hljs-comment" style="color: rgb(92, 99, 112); font-style: italic; line-height: 26px;">/**<br/> * 输出文字标记,任务开始<br/> */</span><br/><span class="hljs-keyword" style="color: rgb(198, 120, 221); line-height: 26px;">echo</span>(<span class="hljs-string" style="color: rgb(152, 195, 121); line-height: 26px;">&#39;任务开始&#39;</span>);<br/><br/><span class="hljs-comment" style="color: rgb(92, 99, 112); font-style: italic; line-height: 26px;">/**<br/> *  后台执行非常耗时的任务<br/> */</span><br/>register_shutdown_function(writeFile);<br/><br/><span class="hljs-comment" style="color: rgb(92, 99, 112); font-style: italic; line-height: 26px;">/**<br/> * 立即发送请求<br/> */</span><br/>fastcgi_finish_request();<br/><br/><br/><br/></code>

ThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能

デモ結果

上記のデモの後、応答は非常に高速になり、ブラウザーが応答した後も、バックグラウンド プログラムが毎秒タイムスタンプを実行します。

上記は、fastcgi_finish_request メソッドの簡単な紹介です。興味があれば、簡単に試してみると、小さな秘密をよりよく理解できるようになります。

3. 特性の説明

カカは 2 年前にこの特性を分析するべきでした、特性 はよくあるものですスーパークラスと呼ばれる。

この機能は PHP5.4 でのみ追加されたもので、頻繁に使用されるインターフェイスやクラスではありません。

この機能は、単一継承しかできないという PHP の大きな弱点を解決するものです。ただし、多重継承とは言えません。厳密に言うと、単なる多重継承に似た機能です。 。

次に事例を紹介します。

テスト ファイル 1 を作成し、対応するクラス名を返します。

ThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能

test1 ファイルを作成し、対応するクラス名を返します

ThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能

##情報を出力するコントローラーファイルを作成します。

ThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能

#コントローラーを作成します

ThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能#対応するスーパー クラス ファイルをコントローラーに導入します。

以上がThinkPHP フレームワークで使用される fastcgi_finish_request と trait の機能の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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