Le processus d'exécution du framework, le routage et l'instanciation du contrôleur précédemment écrits commencent tous à partir d'ici.
Ainsi, lorsque la méthode run est exécutée, le résultat correspondant sera renvoyé ici.
Exécutez l'application et répondez Cette partie du code Container::get('app')
doit 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. La partie avant n'est pas là, et tous les points de connaissance au dos seront écrits dans cette carte mentale.
Processus d'exécution Après avoir exécuté la méthode run, la méthode Container::get('app')->run()->send()
send sera exécutée. Combien de personnes penseraient. que dans 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.
Envoyer des données au client Ne regardons pas d'abord autre chose, regardons cette ligne de code $this->app['hook']
, maintenant nous savons que c'est le cas. Est-il implémenté là-bas ?
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.
Obtenir les données de sortie En fait, dans cette méthode d'obtention des données de sortie, veuillez regarder la première place entourée par Kaka. Cela ne semble absolument pas nécessaire.
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.
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 le débogage classe. Je ne l’expliquerai pas 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.
Vérifier si l'entête HTTP a bien été envoyé La dernière étape, ça arrive, ça arrive , il est venu avec écho et a exécuté une méthode $this->sendData($data);
donnant aux gens le sentiment qu'une belle-fille devient mère. Finalement, lorsqu'il est arrivé au terminal, un écho a fait ressortir la tristesse de dizaines de personnes. jours. ah!
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 !
Données de sortie On passe donc ici à l'exécution du framework puis à l'initialisation de l'application, puis à la détection de route et l'instanciation du contrôleur, puis renvoie l'instance de réponse et exécute la méthode d'envoi via le fichier d'entrée.
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 utilise intelligemment
Dans la section précédente, Container::get('app')->run()->send();
a été utilisé pour exécuter la méthode d'envoi dans la classe de réponse et les données de sortie.
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 délai d'envoi est trop long, cela prend beaucoup de temps et peut cela prend des dizaines de secondes, plus sérieusement, cela entraînera directement l'expiration de la connexion du navigateur.
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
Cas de démonstration Code détaillé
<span style="display: block; background: url(" https: no-repeat rgb height: width: margin-bottom: border-radius:></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: background: rgb border-radius:><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 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> Copier après la connexion
Résultats de la démonstration Les tests ci-dessus sont tous effectués à l'aide du 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 des caractéristiques du trait
Kaka aurait dû analyser cette fonctionnalité il y a deux ans, trait
c'est souvent ça 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, il ne peut pas être appelé héritage multiple. Plus strictement, il s'agit simplement d'une fonction 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.
Le premier fichier de la super classe Crée le fichier test1 et renvoie le nom de classe correspondant
Le deuxième fichier de la super classe crée un fichier de contrôleur pour afficher les informations.
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 le. cercle La première case consiste à introduire directement le fichier de test de super classe.
Introduisez le fichier de super classe correspondant dans le contrôleur puis accédez-y directement pour voir ce qui est renvoyé.
Résultat de retour En accédant au résultat via la figure ci-dessus, vous pouvez voir que la méthode qui renvoie le fichier de super classe Test est la même , mais ce contrôleur est le même. Le contrôleur Controller est également basé sur celui-ci. C'est ce que 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.
Message d'erreur Le message d'erreur dans l'image ci-dessus est dû à l'utilisation de deux super classes dans le contrôleur. Voici comment procéder. pour l'utiliser dans l'image ci-dessous.
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.
Mise en œuvre de la solution Après les modifications apportées à l'image ci-dessus, revenez et jetez un œil aux résultats renvoyés.
Résultat du retour
À ce moment, certains partenaires auront des questions, c'est-à-dire que le résultat de l'impression du cas a toujours été la méthode de la classe Test et la méthode du Test1 la classe n’a pas été imprimée.
Comment y accéder ! Jetons un coup d'oeil.
Code pour accéder à la super classe 2 Comme vous pouvez le voir sur l'image ci-dessus, la méthode d'accès est remplacée par un alias pour contrôler l'accès. Ensuite, jetez un œil aux résultats de la visite.
Résultat de retour de 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 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 analysera comment instancier le contrôleur via le code source de.
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. peut vous apporter un peu d'aide Silk. Je m'appelle Kaka, à la prochaine
.
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!