Heim  >  Artikel  >  PHP-Framework  >  Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden

咔咔
咔咔Original
2020-12-04 13:14:30129Durchsuche
"

In diesem Artikel werden kurz der endgültige Ausführungsprozess des Controllers und die beiden verwendeten erweiterten Attribute untersucht. Eines ist die clevere Verwendung der Methode fastcgi_finish_request und das andere ist die Trait-Funktion. Ich habe ein gewisses Verständnis für das Konzept

Sind Sie etwas verwirrt darüber, wohin die Daten hier letztendlich zurückgegeben werden?

Führen Sie die Anwendung aus

Der Framework-Ausführungsprozess, das Routing und die Controller-Instanziierung, die zuvor geschrieben wurden, beginnen hier.

Wenn also die run-Methode ausgeführt wird, werden die entsprechenden Ergebnisse hier zurückgegeben. Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Führen Sie die Anwendung aus und antworten Sie

Sie sollten alle wissen, dass dieser Teil des Codes

eine Instanz der App-Klasse zurückgibt.
Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werdenFühren Sie dann die run-Methode über die App-Klasse aus, und dann haben Sie alles, was zuvor erwähnt wurde.

Das Bild unten ist eine von Kaka erstellte Mindmap aus der Mitte der Taille. Der vordere Teil ist nicht vorhanden und alle Wissenspunkte auf der Rückseite werden in diese Mindmap geschrieben.

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Ausführungsprozess

Nachdem die Ausführungsmethode ausgeführt wurde, wird sie ausgeführt Container::get('app')->run()->send() Wie viele Leute würden denken, dass die Sendemethode in der App-Klasse ausgeführt wird? Container::get('app')->run()->send()send这个方法,有多少人会认为在App类里边执行send方法。

其实不是的,回想一下之前执行控制器方法然后返回的响应结果是什么?

如果你不是很粗略的看都会记得是Response的一个对象实例。

所以说send方法会去response类里边去执行。

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden

先不看其它的,先看这行代码$this->app['hook'],现在知道是执行的那里吗?

这种形式就是通过访问数组形式去访问对象的属性,也就是之前解析的ArrayAccess这个类。当访问的属性不存在时会去执行offsetGet,然后执行魔术方法__get,最终通过make方法返回实例,这一切的操作都是在容器中。

对这行代码具体是监听的什么就不去做解析了。

接着需要看处理Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden的这行代码$data = $this->getContent();

Eigentlich nein, erinnern Sie sich, was das Antwortergebnis war, das nach der vorherigen Ausführung der Controller-Methode zurückgegeben wurde?

Wenn Sie es nicht ganz grob betrachten, werden Sie sich daran erinnern, dass es sich um eine Objektinstanz von Response handelt. 🎜🎜Die Sendemethode wird also in der Antwortklasse ausgeführt. 🎜🎜Daten an Client senden🎜Daten an den Client senden🎜🎜🎜Schauen Sie sich nicht zuerst andere Dinge an, schauen wir uns zuerst diese Codezeile an$this->app['hook'], wissen Sie jetzt, wo es ist? wird ausgeführt? 🎜🎜Dieses Formular dient zum Zugriff auf die Eigenschaften des Objekts durch Zugriff auf das Array, bei dem es sich um die zuvor analysierte ArrayAccess-Klasse handelt. Wenn das Attribut, auf das zugegriffen wird, nicht vorhanden ist, wird offsetGet ausgeführt, dann wird die magische Methode __get ausgeführt und schließlich wird die Instanz über die make-Methode zurückgegeben. Alle diese Vorgänge werden im Container ausgeführt. 🎜🎜Ich werde nicht analysieren, was genau diese Codezeile überwacht. 🎜🎜Dann müssen Sie sich diese Codezeile ansehen, die die Ausgabedaten verarbeitet$ data = $this->getContent();🎜🎜Diese Methode weist die übergebenen Daten dem Inhaltsattribut dieser Klasse zu. 🎜
Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Erhalten Sie die Ausgabedaten

Tatsächlich schauen Sie sich bei dieser Methode zum Abrufen der Ausgabedaten bitte die erste eingekreiste Stelle an. Es fühlt sich sehr unnötig an.

Sie können sehen, dass die Daten überhaupt nicht verarbeitet werden, sie werden nur zurückgegeben. Daher hat das Framework gute und schlechte Punkte. Sie werden es nur wissen, wenn Sie es lesen, sonst werden Sie verwirrt sein, was Sie oft verwenden . Werkzeuge wissen nichts.

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Verarbeiten von Daten

Der nächste Schritt ist die Trace-Debugging-Injektion, die über die Konfigurationsdatei konfiguriert und durch Aufrufen der Debug-Klasse implementiert wird, was hier nicht im Detail erläutert wird.

Dann gibt es ein Caching-Urteil, das im folgenden Artikel separat besprochen wird und daher verabschiedet wird.

Der nächste Schritt besteht darin, den Antwortheader festzulegen und festzustellen, ob der HTTP-Header gesendet wurde. Dies ist sehr wichtig und ein Wissenspunkt, der selten offengelegt wird.

  • headers_sent(): Erkennen, ob der HTTP-Header gesendet wurde
  • http_response_code(): HTTP-Statuscode der Antwort abrufen/festlegen
  • header: Die Funktion sendet den ursprünglichen HTTP-Header an den Client .
检测 HTTP 头是否已经发送
Überprüfen Sie, ob der HTTP-Header gesendet wurde

Der letzte Schritt, es kommt, es kommt, es kommt mit Echo und führt eine Methode aus$this->sendData($data);

Es gibt den Menschen das Gefühl, dass eine Tochter Law ist zur Schwiegermutter geworden. Es fühlt sich an, als wäre ich endlich am Terminal angekommen, und ein Echo hat die Traurigkeit von Dutzenden Tagen zum Ausdruck gebracht!

Um dieses Echo Kaka zu erreichen, haben wir 9981 Schwierigkeiten durchgemacht! Der Kampf hat noch nicht aufgehört, die Kameraden müssen noch hart arbeiten!

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Daten ausgeben

Hier gehen wir also zur Framework-Ausführung und dann zur Anwendungsinitialisierung, zur Routenerkennung, zur Controller-Instanziierung, kehren dann zur Antwortinstanz zurück und führen dann die Sendemethode über die Eintragsdatei aus.

Endlich die Daten an das Terminal ausgeben, was eine Echo-Sache ist.

Obwohl der Kampf hier vorbei ist, gibt es unten immer noch einen sehr wichtigen Wissenspunkt, und Kaka wird ihn noch einmal erwähnen, um ihn zu erklären.

2. Die fastcgi_finish_request-Methode wird geschickt verwendet

im vorherigen Abschnitt übergeben Container::get('app')->run()->send();Die send-Methode wird in der Antwortklasse ausgeführt und die Daten werden ausgegeben . Container::get('app')->run()->send();在response类中执行了send方法,输出了数据。

但是在Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden之后还执行了一个方法fastcgi_finish_request();

Aber nach der Ausgabe der Daten wird auch eine Methode ausgeführt fastcgi_finish_request ();, der Kommentar soll die Seitenreaktion verbessern, schauen wir uns das Rätsel genauer an.

Ich habe diese Passage auf der offiziellen PHP-Website gesehen

Das Skript wird nach fastcgi_finish_request() immer noch einen FPM-Prozess belegen. Wenn Sie es also übermäßig für lang laufende Aufgaben verwenden, kann dies dazu führen, dass alle Ihre FPM-Threads bis zu pm.max_children belegt werden Gateway-Fehler auf dem Webserver.

Nach fastcgi_finish_request() wird das Skript weiterhin den FPM-Prozess belegen. Wenn Sie es also für lang laufende Aufgaben übermäßig verwenden, kann dies dazu führen, dass alle Ihre FPM-Threads bis zu pm.max_children blockiert werden. Dies führt zu einem Gateway-Fehler auf dem Webserver.

Verwenden Sie diese Methode also nicht in Ihren eigenen Projekten, ohne sie gründlich zu verstehen.

Als nächstes wird Kaka die Verwendung dieser Methode anhand eines Falls demonstrieren. Es handelt sich lediglich um eine Demonstration. Wenn Sie sie in einem Projekt verwenden müssen, lesen Sie das Dokument bitte sorgfältig durch und achten Sie auf die Probleme.

Falldemonstration

🎜

Das Unternehmen hat ein Unternehmen, das Benachrichtigungen an Benutzer senden muss. Da die Sendezeit jedoch zu lang ist, kann dies sehr zeitaufwändig sein. Dies kann Dutzende von Sekunden dauern oder, was noch schlimmer ist, direkt dazu führen, dass die Browserverbindung unterbrochen wird aus.

Ein Problem ist die Benutzererfahrung, die lange warten muss, und die Erfahrung ist sicherlich nicht gut.

Um die beiden oben genannten Probleme zu lösen, sprechen wir heute über fastcgi_finish_request ist praktisch. fastcgi_finish_request就派上了用场。

理解

对这个函数的理解其实就是发送响应给浏览器,用户等待时间大大缩短,但是PHP进程还是在运行的。

这样就达到了来个目的,就类似于我们经常说的异步执行。

直观的来说就是发送邮件有可能需要10秒,但是用户是没有感知的,用户点击发送邮件之后直接就返回发送成功,浏览器响应结束,用户做其它事情,后台进程继续执行发送邮件的任务。

案例

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden

具体代码

<span style="display: block; background: url(https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;"></span><code class="hljs" style="overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;"><span class="hljs-meta" style="color: #61aeee; line-height: 26px;"><?php</span><br/><span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> * 设置超时时间,变成不限制<br/> *<br/> */</span><br/>set_time_limit(<span class="hljs-number" style="color: #d19a66; line-height: 26px;">0</span>);<br/><br/><span class="hljs-comment" style="color: #5c6370; 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: #c678dd; line-height: 26px;">function</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">writeFile</span><span class="hljs-params" style="line-height: 26px;">()</span><br/></span>{<br/>    $path = <span class="hljs-string" style="color: #98c379; line-height: 26px;">&#39;D:/phpstudy_pro/WWW/kaka.txt&#39;</span>;<br/>    file_put_contents($path,<span class="hljs-string" style="color: #98c379; line-height: 26px;">&#39;程序运行开始&#39;</span> . PHP_EOL,FILE_APPEND);<br/>    <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">for</span>($i =<span class="hljs-number" style="color: #d19a66; line-height: 26px;">0</span>;$i < <span class="hljs-number" style="color: #d19a66; line-height: 26px;">5</span>;$i++) {<br/>        file_put_contents($path,time() . PHP_EOL,FILE_APPEND);<br/>        sleep(<span class="hljs-number" style="color: #d19a66; line-height: 26px;">1</span>);<br/>    }<br/><br/>    file_put_contents($path,<span class="hljs-string" style="color: #98c379; line-height: 26px;">&#39;程序运行结束&#39;</span> . PHP_EOL,FILE_APPEND);<br/><br/>}<br/><br/><span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> * 输出文字标记,任务开始<br/> */</span><br/><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">echo</span>(<span class="hljs-string" style="color: #98c379; line-height: 26px;">&#39;任务开始&#39;</span>);<br/><br/><span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> *  后台执行非常耗时的任务<br/> */</span><br/>register_shutdown_function(writeFile);<br/><br/><span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> * 立即发送请求<br/> */</span><br/>fastcgi_finish_request();<br/><br/><br/><br/></code>
Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden

以上测试全部使用linux系统进行测试哈,否则你看不到直观的效果。

经过上面的演示,响应非常快,浏览器响应结束后,后台程序依然进行执行每秒执行一个时间戳。

以上就是对fastcgi_finish_request

Verstehen🎜🎜Das Verständnis dieser Funktion besteht eigentlich darin, eine Antwort an den Browser zu senden Die Wartezeit des Benutzers wird verkürzt, der PHP-Prozess läuft jedoch noch. 🎜🎜Damit wird ein Zweck erreicht, der dem ähnelt, was wir oft als asynchrone Ausführung bezeichnen. 🎜🎜Intuitiv gesehen kann das Senden einer E-Mail 10 Sekunden dauern, der Benutzer ist sich dessen jedoch nicht bewusst. Nachdem der Benutzer zum Senden der E-Mail geklickt hat, wird direkt der Sendeerfolg zurückgegeben, die Browserantwort endet und der Benutzer führt andere Schritte aus Dinge, und der Hintergrundprozess sendet weiterhin die E-Mail-Aufgabe. 🎜🎜Case🎜
Demo case
🎜Spezifischer Code🎜rrreee
Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werdenDemonstrationsergebnisse
🎜Alle oben genannten Tests wurden mit dem Linux-System durchgeführt, sonst werden Sie den intuitiven Effekt nicht sehen. 🎜🎜Nach der obigen Demonstration ist die Antwort sehr schnell. Nachdem der Browser reagiert hat, führt das Hintergrundprogramm weiterhin jede Sekunde einen Zeitstempel aus. 🎜🎜Das Obige ist der <span class="prefix" style="display: none;"></span><span class="content" style="display: inline-block; font-weight: normal; background: rgb(248, 57, 41); color: #ffffff; padding: 3px 10px 1px; border-radius: 0 0 13px 13px;">3. Erklärung der Merkmalsmerkmale</span><span class="suffix"></span><p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Kaka hätte dieses Merkmal vor zwei Jahren analysieren sollen <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">traitEs wird oft als Superklasse bezeichnet.

Diese Funktion wurde nur in PHP5.4 hinzugefügt. Diese Funktion ist weder eine häufig verwendete Schnittstelle noch eine Klasse.

Diese Funktion soll eine große Schwäche von PHP beheben, nämlich dass es nur eine Einzelvererbung geben kann. Eine strengere Funktion ist jedoch nur eine Funktion, die der Mehrfachvererbung ähnelt.

Als nächstes zeige ich Ihnen einen Fall.

Erstellen Sie Testdatei 1 und geben Sie den entsprechenden Klassennamen zurück.

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Die erste Datei der Superklasse

erstellt die Datei test1 und gibt den entsprechenden Klassennamen zurück

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Die zweite Datei der Superklasse

erstellt eine Controller-Datei zur Ausgabe von Informationen.

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Erstellen Sie den Controller

und führen Sie dann die entsprechende Superklassendatei in den Controller ein. Hier ist das erste eingekreiste Kästchen zu beachten.

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Fügen Sie die entsprechende Superklassendatei im Controller ein

Dann können Sie direkt darauf zugreifen und sehen, was zurückgegeben wird.

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Ergebnisse zurückgeben

Sie können dem obigen Bild entnehmen, dass die Methode die Test-Superklassendatei zurückgibt, aber dieser Controller basiert auch auf dem Controller-Controller, der am Anfang des Artikels erwähnten Superklasse Implementieren Sie einfach eine Funktion mit Mehrfachvererbung.

Aber es wird hier ein Problem geben, bitte beachten Sie die Fehlermeldung unten.

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Fehlermeldung

Die Fehlermeldung im Bild oben wird durch die Verwendung von zwei Superklassen im Controller verursacht, wie sie im Bild unten verwendet wird.

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Der Controller verwendet zwei Superklassen

So lösen Sie diese Fehlermeldung! Folgen Sie anschließend dem Rhythmus dieses Klicks.

Fehlermeldungen beheben

Bevor Sie das vorherige Problem lösen, müssen Sie zunächst verstehen, was dieses Problem verursacht hat.

Der Grund für diesen Fehler ist, dass die beiden referenzierten Merkmale Hello-Funktionen mit demselben Namen haben und ein Konflikt vorliegt.

Aber diese Situation kann in der täglichen Entwicklung vermieden werden, da es immer noch sehr praktisch ist, den Methodennamen manuell zu ändern, aber hier zeigt Ihnen Kaka, wie Sie dieses Problem lösen können.

Die erste besteht darin, die Methode „hello“ in einem Merkmal zu verwenden, um die Methode mit demselben Namen in einem anderen Merkmal zu überschreiben. Da die Inhalte der beiden Methoden konsistent sind, entscheide ich mich direkt dafür, sie hier zu überschreiben Geben Sie ihnen Aliase mit as, damit es keinen Konflikt mehr gibt. Das Schlüsselwort as hat eine andere Verwendung, nämlich die Zugriffskontrolle einer Methode zu ändern.

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Implementierung der Lösung

Besuchen Sie nach den Änderungen im obigen Bild erneut und sehen Sie sich die zurückgegebenen Ergebnisse an.

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Ergebnisse zurückgeben

Dann werden einige Partner zu diesem Zeitpunkt Fragen haben, das heißt, das Falldruckergebnis war immer die Methode der Testklasse und die Methode der Test1-Klasse wurde nicht gedruckt.

Dann wie zu besuchen! Werfen wir einen Blick darauf.

Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Code für den Zugriff auf Superklasse 2

Auf dem Bild oben können Sie sehen, dass die Zugriffsmethode in Alias-Zugriffssteuerung geändert wurde. Schauen wir uns dann die Zugriffsergebnisse an.

超类二Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
Rückgabeergebnis der Superklasse zwei

Wie Sie auf dem Bild oben sehen können, ist das Rückgabeergebnis das Rückgabeergebnis der Superklasse Test1.

Was die Verwendung von as angeht, müssen Sie nach der Verwendung suchen. Manchmal kann man viel Wissen lernen, indem man auf die Details achtet.

Zusammenfassung

Dies ist die Quellcode-Analyse des Controllers. Kaka analysiert, wie der Controller durch den Quellcode instanziiert wird.

Wir haben auch noch einmal die Aufrufbeziehung zwischen ArrayAccess und magischen Methoden besprochen. Sie müssen über das Problem nachdenken.

So reagieren Sie auf Daten nach dem Zugriff auf den Controller usw.

Ich habe auch etwas über die clevere Verwendung der Methode fastcgi_finish_request im Quellcode erfahren, aber wenn Sie diese Funktion verwenden, müssen Sie die beiden genannten Punkte zu Kaka beachten.

Abschließend gibt es noch eine einfache Fallbeschreibung der Superklasse.

Beharrlichkeit beim Lernen, Beharrlichkeit beim Bloggen und Beharrlichkeit beim Teilen sind die Überzeugungen, die Kaka seit seiner Karriere vertritt. Ich hoffe, dass Kakas Artikel im riesigen Internet Ihnen ein wenig helfen können Kaka, wir sehen uns in der nächsten Ausgabe.

Das obige ist der detaillierte Inhalt vonFeatures fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn