Heim > Artikel > PHP-Framework > Features fastcgi_finish_request und Trait, die vom ThinkPHP-Framework verwendet werden
“In diesem Artikel werden kurz der endgültige Ausführungsprozess des Controllers und die beiden verwendeten erweiterten Attribute untersucht. Das eine ist die clevere Verwendung der Methode „fastcgi_finish_request“ und das andere ist die Eigenschaftsfunktion, von der ich ein gewisses Verständnis habe Superklasse. Lasst es uns gemeinsam analysieren Klasse, und die Ausführung wurde bis zu diesem Zeitpunkt abgeschlossen.
Sind Sie etwas verwirrt darüber, wohin die Daten hier letztendlich zurückgegeben werden?
Der zuvor geschriebene Framework-Ausführungsprozess, das Routing und die Controller-Instanziierung werden alle von hier aus eingegeben.
Wenn also die run-Methode ausgeführt wird, werden die entsprechenden Ergebnisse hier zurückgegeben.
Dieser Teil des CodesContainer::get('app')
Sie sollten alle wissen, dass es eine Instanz der App-Klasse zurückgibt. Container::get('app')
应该都知道了是返回一个App类的实例。
然后通过App类去执行run方法,才会有之前讲过的一切。
下图是咔咔从半中腰做的一个思维导图,前面的没有,后边的所有知识点都会写在这个思维导图里。
执行完run方法就会去执行Container::get('app')->run()->send()
🎜 🎜🎜Ausführungsprozess🎜🎜🎜Nachdem die Ausführungsmethode ausgeführt wurde, wird sie Container::get('app')->run()->send()
Wie viele Leute würden denken, dass die Sendemethode in der App-Klasse ausgeführt wird? 🎜🎜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 sehr 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.
Schauen Sie sich zuerst nichts anderes an, schauen wir uns zuerst diese Codezeile an$this->app['hook']
, wissen Sie jetzt, wo es ausgeführt wird? $this->app['hook']
,现在知道是执行的那里吗?
这种形式就是通过访问数组形式去访问对象的属性,也就是之前解析的ArrayAccess这个类。当访问的属性不存在时会去执行offsetGet,然后执行魔术方法__get,最终通过make方法返回实例,这一切的操作都是在容器中。
对这行代码具体是监听的什么就不去做解析了。
接着需要看处理输出数据的这行代码$data = $this->getContent();
$data = $this->getContent();
🎜🎜Diese Methode weist die übergebenen Daten dem Inhaltsattribut dieser Klasse zu. 🎜
Tatsächlich schauen Sie sich bei dieser Methode zum Abrufen der Ausgabedaten bitte die erste von Kaka eingekreiste Stelle an. Es fühlt sich sehr unnötig an.
Sie können sehen, dass die Daten überhaupt nicht verarbeitet werden, sondern nur zurückgegeben werden. 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.
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.
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, eine Ehefrau zu sein . Es fühlt sich an wie eine Mutter, ich bin endlich am Terminal angekommen und ein Echo strahlte die Traurigkeit von Dutzenden Tagen aus!
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!
Hier gehen wir also zur Framework-Ausführung und dann zur Anwendungsinitialisierung, zur Routenerkennung, Controller-Instanziierung, kehren dann zur Antwortinstanz zurück und führen dann die Sendemethode über die Eintragsdatei aus.
Geben Sie die Daten schließlich an das Terminal aus, 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.
durch 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方法,输出了数据。
但是在输出数据之后还执行了一个方法fastcgi_finish_request();
Ich habe diese Passage auf der offiziellen PHP-Website gesehenDas Skript wird nach fastcgi_finish_request() immer noch einen FPM-Prozess belegen. Daher kann die übermäßige Verwendung für lang laufende Aufgaben alle Ihre FPM-Threads bis zu pm.max_children belegen Gateway-Fehler auf dem Webserver.🎜Nach fastcgi_finish_request() belegt das Skript weiterhin den FPM-Prozess. 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, ist dies sehr zeitaufwändig und kann in schwerwiegenderen Fällen mehrere Sekunden dauern direkt zu einem Timeout der Browserverbindung führen.
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, ist das fastcgi_finish_request
, über das wir heute gesprochen haben, praktisch.
verstehen
Das Verständnis dieser Funktion besteht tatsächlich darin, eine Antwort an den Browser zu senden. Die Wartezeit des Benutzers wird erheblich verkürzt, der PHP-Prozess läuft jedoch weiterhin.
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, aber der Benutzer ist sich dessen 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.
Fall
Spezifischer Code
<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;">'D:/phpstudy_pro/WWW/kaka.txt'</span>;<br/> file_put_contents($path,<span class="hljs-string" style="color: rgb(152, 195, 121); line-height: 26px;">'程序运行开始'</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;">'程序运行结束'</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;">'任务开始'</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>
Alle oben genannten Tests werden mit dem Linux-System durchgeführt Ich sehe den intuitiven Effekt nicht.
Nach der obigen Demonstration erfolgt die Reaktion sehr schnell. Nachdem der Browser reagiert hat, führt das Hintergrundprogramm weiterhin jede Sekunde einen Zeitstempel aus.
Das Obige ist der fastcgi_finish_request
方法的简单介绍,如果你也感兴趣可以进行简单的尝试一下,有助于更好的去理解其中的小秘密。
三、trait特性讲解
应该在俩年前咔咔就对这个特性进行过一次解析,trait
3. Erklärung der Merkmalseigenschaften
Kaka hätte diese Funktion vor zwei Jahren analysieren sollen, trait
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. 🎜
erstellt die test1-Datei und gibt den entsprechenden Klassennamen zurück
erstellt eine Controller-Datei zur Ausgabe von Informationen.
und führen Sie dann die entsprechende Superklassendatei in den Controller ein. Hier ist das erste eingekreiste Kästchen zu beachten.
Dann können Sie direkt darauf zugreifen und sehen, was zurückgegeben wird.
Greifen Sie über das obige Bild auf die Ergebnisse zu. Sie können sehen, dass die Methode, die die Test-Superklassendatei zurückgibt, ebenfalls auf dem Controller-Controller basiert . Die Superklasse implementiert lediglich eine Funktion der Mehrfachvererbung.
Aber es wird hier ein Problem geben, bitte beachten Sie die Fehlermeldung unten.
Die Fehlermeldung im Bild oben wird durch die Verwendung von zwei Superklassen im Controller verursacht, so wie sie im Bild unten verwendet wird.
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.
Implementierung der Lösung
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.
Auf dem Bild oben können Sie sehen, dass die Zugriffsmethode in einen Alias geändert wurde, um den Zugriff zu steuern. Schauen wir uns dann die Zugriffsergebnisse an.
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
Das ist alles für 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 auf die beiden genannten Punkte zu Kaka achten.
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!