Maison > cadre php > PensezPHP > le corps du texte

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP

咔咔
Libérer: 2020-12-04 13:32:59
original
161 Les gens l'ont consulté
«

Cet article étudiera brièvement le processus d'exécution final du contrôleur et les deux attributs avancés utilisés L'un est l'utilisation intelligente de la méthode fastcgi_finish_request, et l'autre est l'utilisation intelligente de la méthode fastcgi_finish_request. fonctionnalité de trait. Nous avons une certaine compréhension du concept de super classe, analysons-le ensemble 🎜>

Lorsque la méthode dans le contrôleur est exécutée, les données de réponse sont envoyées à l'exécution. méthode de la classe App, et l'exécution est terminée jusqu'à présent.

Application d'exécution

Le processus d'exécution du framework, le routage et l'instanciation du contrôleur écrits auparavant sont tous saisis à partir d'ici.

Ainsi, lorsque la méthode run est exécutée, le résultat correspondant sera renvoyé ici.

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Exécutez l'application et répondez

Cette partie du code

devrait tous savoir qu'elle renvoie une instance de la classe App.

Ensuite, exécutez la méthode run via la classe App, et vous aurez alors tout ce qui a été mentionné précédemment.

L'image ci-dessous est une carte mentale réalisée par Kaka à partir du milieu de la taille. Celle du devant n'est pas là, et tous les points de connaissance au dos seront écrits dans cette carte mentale.

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Processus d'exécution

Après avoir exécuté la méthode run, la Container::get('app')->run()->send()méthode send sera exécutée. Combien de personnes penseraient que la méthode send est exécutée. dans la classe App ?

En fait non, rappelez-vous quel a été le résultat de la réponse renvoyé après l'exécution de la méthode du contrôleur auparavant ?

Si vous ne le regardez pas de manière très grossière, vous vous souviendrez qu'il s'agit d'une instance objet de Response.

La méthode send sera donc exécutée dans la classe de réponse.

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Envoyer des données au client

Ne regardons pas d'abord d'autres choses. Regardons cette ligne de code $this->app['hook'] Maintenant, savez-vous où. c'est exécuté ?

Ce formulaire permet d'accéder aux propriétés de l'objet en accédant au formulaire tableau, qui est la classe ArrayAccess analysée précédemment. Lorsque l'attribut accédé n'existe pas, offsetGet est exécuté, puis la méthode magique __get est exécutée, et enfin l'instance est renvoyée via la méthode make. Toutes ces opérations sont effectuées dans le conteneur.

Je n’analyserai pas ce que surveille exactement cette ligne de code.

Ensuite, vous devez regarder la ligne de code qui traite les données de sortie $data = $this->getContent();

Cette méthode permet d'attribuer les données transmises à l'attribut de contenu de cette classe.

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Obtenir les données de sortie

En fait, dans cette méthode d'obtention des données de sortie, veuillez regarder le premier endroit encerclé, cela semble très inutile.

Vous pouvez voir qu'il n'y a aucun traitement des données, elles sont simplement renvoyées, donc le framework a des bons et des mauvais points. Vous seul saurez si vous le lisez, sinon vous vous tromperez. sur les outils que vous utilisez régulièrement.

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Traitement des données

L'étape suivante est l'injection de débogage Trace, qui est configurée via le fichier de configuration et implémentée en appelant la classe debug, qui ne sera pas expliqué en détail ici.

Ensuite, il y a le jugement de mise en cache. La mise en cache sera abordée séparément dans l'article suivant, donc ça va.

L'étape suivante consiste à définir l'en-tête de réponse et à détecter si l'en-tête HTTP a été envoyé. Ceci est très important, et c'est aussi un point de connaissance rarement exposé.

  • headers_sent() : Vérifiez si l'en-tête HTTP a été envoyé
  • http_response_code() : Obtenez/définissez le code d'état HTTP de la réponse
  • en-tête : La fonction envoie l'en-tête HTTP brut au client.
检测 HTTP 头是否已经发送
Vérifier si l'en-tête HTTP a été envoyé

La dernière étape, ça vient, ça vient, ça vient avec écho Maintenant , j'ai mis en place une méthode $this->sendData($data);

pour donner aux gens le sentiment d'une belle-fille devenant mère Enfin, lorsque je suis arrivée au terminal, un écho a fait ressortir la tristesse de dizaines de jours !

Pour atteindre cet écho, nous avons traversé beaucoup de difficultés ! La bataille ne s'est pas encore arrêtée, les camarades doivent encore travailler dur !

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Données de sortie

On passe donc ici à l'exécution du framework puis à l'initialisation de l'application, à la détection de route, à l'instanciation du contrôleur, puis au retour à l'instance de réponse , via l'entrée Le fichier exécute la méthode d'envoi.

Enfin, envoyez les données au terminal, ce qui est une chose d'écho.

Bien que la bataille ici soit terminée, il y a encore un point de connaissance très important ci-dessous, et Kaka le mentionnera à nouveau pour l'expliquer.

2. La méthode fastcgi_finish_request est intelligemment utilisée

est exécutée dans la classe de réponse via Container::get('app')->run()->send(); dans le section précédente La méthode d'envoi est utilisée et les données sont sorties.

Mais après la sortie des données, une méthode fastcgi_finish_request(); est également exécutée. Le commentaire vise à améliorer la réponse de la page. Regardons de plus près le mystère.

J'ai vu ce passage sur le site officiel de PHP

Le script occupera toujours un processus FPM après fastcgi_finish_request() Donc, l'utiliser de manière excessive pour des tâches de longue durée peut occuper tous vos threads FPM jusqu'à . pm.max_children. Cela entraînera des erreurs de passerelle sur le serveur Web.

Après fastcgi_finish_request(), le script occupera toujours le processus FPM. Donc, en abuser pour des tâches de longue durée peut bloquer tous vos threads FPM jusqu'à pm.max_children. Cela provoquera une erreur de passerelle sur le serveur Web.

N’utilisez donc pas cette méthode dans vos propres projets sans une compréhension approfondie de celle-ci.

Ensuite, Kaka utilisera un cas pour démontrer l'utilisation de cette méthode. Il s'agit simplement d'une démonstration. Si vous devez l'utiliser dans un projet, veuillez lire attentivement le document et prêter attention aux problèmes.

Démonstration de cas

L'entreprise a une activité qui doit envoyer des notifications aux utilisateurs, mais comme le temps d'envoi est trop long, cela prend beaucoup de temps, ou plus sérieusement, cela provoquera directement la connexion du navigateur. pour expirer.

Un problème est l'expérience utilisateur. Les utilisateurs attendent longtemps, et l'expérience n'est certainement pas bonne.

Afin de résoudre les deux problèmes ci-dessus, le fastcgi_finish_request discuté aujourd'hui s'avère utile.

Compréhension

La compréhension de cette fonction consiste en fait à envoyer une réponse au navigateur. Le temps d'attente de l'utilisateur est considérablement réduit, mais le processus PHP est toujours en cours d'exécution.

Cela atteint un objectif similaire à ce que nous appelons souvent l'exécution asynchrone.

Intuitivement parlant, l'envoi d'un e-mail peut prendre 10 secondes, mais l'utilisateur n'en est pas conscient. Une fois que l'utilisateur a cliqué pour envoyer l'e-mail, il indiquera directement que l'envoi est réussi, la réponse du navigateur. se termine, l'utilisateur fait autre chose et le processus en arrière-plan continue d'effectuer la tâche d'envoi d'e-mails.

Cas

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Cas de démonstration

Code détaillé

<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>
Copier après la connexion
Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Résultats de la démonstration

Les tests ci-dessus sont tous effectués en utilisant le système Linux, sinon vous ne verrez pas l'effet intuitif.

Après la démonstration ci-dessus, la réponse est très rapide. Une fois que le navigateur a répondu, le programme en arrière-plan est toujours en cours d'exécution et un horodatage est exécuté toutes les secondes.

Ce qui précède est une brève introduction à la méthode fastcgi_finish_request Si vous êtes également intéressé, vous pouvez l'essayer simplement, ce qui vous aidera à mieux comprendre les petits secrets impliqués.

3. Explication de la fonctionnalité du trait

Kaka aurait dû analyser cette fonctionnalité il y a deux ans, traitC'est ce qui est souvent appelé une super classe.

Cette fonctionnalité n'a été ajoutée que dans PHP5.4. Cette fonctionnalité n'est pas une interface fréquemment utilisée ni une classe.

Cette fonctionnalité vise à résoudre une faiblesse majeure de PHP, à savoir qu'il ne peut avoir qu'un seul héritage. Cependant, cela ne peut pas être appelé héritage multiple. Une fonction plus rigoureuse est simplement similaire à l'héritage multiple.

Ensuite, je vais vous montrer un cas.

Créez le fichier de test 1 et renvoyez le nom de classe correspondant.

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Le premier fichier de la super classe

Crée le fichier test1 et renvoie le nom de classe correspondant

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Super Le deuxième fichier de la classe

crée un fichier contrôleur pour afficher les informations.

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Créez le contrôleur

puis introduisez le fichier de super classe correspondant dans le contrôleur. Ce qu'il faut noter ici, c'est la première case encerclée, celle-ci. frame consiste à introduire directement le fichier de test de super classe.

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Introduisez le fichier de super classe correspondant

dans le contrôleur puis accédez-y directement pour voir ce qui sera renvoyé.

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Renvoyer les résultats

En accédant aux résultats via l'image ci-dessus, vous pouvez voir que la méthode qui renvoie le fichier de super classe Test est également basée sur le contrôleur Controller , c'est pourquoi la super classe mentionnée au début de l'article implémente simplement une fonction d'héritage multiple.

Mais il y aura un problème ici, veuillez consulter le message d'erreur ci-dessous.

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Message d'erreur

Le message d'erreur dans l'image ci-dessus est dû à l'utilisation de deux super classes dans le contrôleur, c'est ainsi que l'image ci-dessous est utilisée. .

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Le contrôleur utilise deux super classes

Alors comment résoudre ce message d'erreur ! Suivez ensuite le rythme de ce clic.

Résolution des messages d'erreur

Avant de résoudre le problème précédent, vous devez d'abord comprendre la cause de ce problème.

La raison de cette erreur est que les deux traits référencés ont des fonctions hello portant le même nom, et il y a un conflit.

Mais cette situation peut être évitée dans le développement quotidien, car il est toujours très pratique de changer manuellement le nom de la méthode, mais ici Kaka vous apprend comment résoudre ce problème.

La première consiste à utiliser la méthode hello dans un trait pour écraser la méthode du même nom dans un autre trait. Parce que le contenu des deux méthodes est cohérent, j'ai directement choisi de le couvrir ici

La seconde consiste à les utiliser comme alias afin qu'il n'y ait pas de conflits. Le mot-clé as a une autre utilisation, qui consiste à modifier le contrôle d'accès d'une méthode.

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Mise en œuvre de la solution

Après avoir apporté les modifications dans l'image ci-dessus, revenez et jetez un œil aux résultats renvoyés.

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Résultat du retour

Ensuite, certains partenaires auront des questions à ce moment-là, c'est-à-dire que le résultat de l'impression du cas est toujours la méthode de la classe Test, et la méthode de la classe Test1 est toujours Aucune impression n'est effectuée.

Comment y accéder ! Jetons un coup d'oeil.

Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Code pour accéder à la super classe 2

Comme vous pouvez le voir sur l'image ci-dessus, la méthode d'accès a été modifiée pour contrôler l'accès par alias, puis passons jetez un œil aux résultats d’accès.

超类二Caractéristiques fastcgi_finish_request et trait utilisés par le framework ThinkPHP
Résultat de retour de la super classe deux

Comme vous pouvez le voir sur l'image ci-dessus, le résultat de retour est le résultat de retour de la super classe Test1.

Donc, concernant l'utilisation de as, vous devez rechercher comment l'utiliser. Parfois, vous pouvez apprendre beaucoup de connaissances en prêtant attention aux détails.

Résumé

C'est tout pour l'analyse du code source du contrôleur, Kaka vous le donnera via le code source Analysez la manière dont le contrôleur est instancié.

La relation d'appel entre ArrayAccess et les méthodes magiques est également abordée à nouveau. Vous devez avoir votre propre réflexion pour réfléchir au problème.

Voici comment répondre aux données après avoir accédé au contrôleur, etc.

J'ai également appris l'utilisation intelligente de la méthode fastcgi_finish_request dans le code source, mais lorsque vous utilisez cette fonction, vous devez faire attention aux deux points mentionnés à propos de Kaka.

Enfin, il y a une simple description de cas de la super classe.

«

La persévérance dans l'apprentissage, la persévérance dans les blogs et la persévérance dans le partage sont les convictions auxquelles Kaka a toujours adhéré depuis sa carrière. J'espère que les articles de Kaka dans l'immense Internet. Je peux vous apporter un peu d'aide Silk. Je m'appelle Kaka, à la prochaine fois.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
1
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!