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.
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.
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.
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.
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.
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.
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 !
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
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;">'D:/phpstudy_pro/WWW/kaka.txt'</span>;<br/> file_put_contents($path,<span class="hljs-string" style="color: #98c379; line-height: 26px;">'程序运行开始'</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;">'程序运行结束'</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;">'任务开始'</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> 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, trait
C'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.
Le premier fichier de la super classe Crée le fichier test1 et renvoie le nom de classe correspondant
Super Le deuxième fichier de la classe crée un fichier 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 la première case encerclée, celle-ci. frame 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 sera renvoyé.
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.
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. .
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 avoir apporté les modifications dans l'image ci-dessus, revenez et jetez un œil aux résultats renvoyés.
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.
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.
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.