Lors du développement d'applications PHP, en particulier des scénarios impliquant un flux de données en temps réel, tels que la diffusion en direct, le chat en direct, le système de surveillance ou les mises à jour dynamiques de données, nous devons souvent améliorer la vitesse de réponse de la page Web pour assurer une expérience utilisateur fluide. Par défaut, PHP n'enverra au navigateur qu'après avoir sorti toutes les données, ce qui peut entraîner le chargement lent de la page Web, en particulier lorsque le volume de données est important ou que les performances en temps réel sont solides. Pour optimiser cela, nous pouvons utiliser la fonction OB_FLOSH pour atteindre une sortie instantanée, réduire la latence et améliorer la douceur de la page Web.
ob_flush () est une fonction de contrôle de tampon de sortie de PHP. Il est utilisé pour rincer le contenu du tampon de sortie et forcer les données du tampon au navigateur, plutôt que d'attendre que le script soit exécuté avant de l'envoyer. Habituellement, PHP stockera toutes les sorties dans le tampon en mode par défaut et sera envoyée au navigateur après l'exécution du script. Ce mécanisme peut améliorer les performances, mais dans certains scénarios où une sortie en temps réel est requise, des retards inutiles peuvent être générés.
En utilisant ob_flush () , vous pouvez contrôler manuellement lorsque les données du tampon sont envoyées au navigateur, ainsi actualiser en temps réel et améliorer l'expérience utilisateur.
Afin de pouvoir utiliser OB_FLOSH , vous devez d'abord vous assurer que la tampon de sortie est activée. Le tampon de sortie peut être démarré avec ob_start () puis la sortie en temps réel via ob_flush () . Un processus typique est le suivant:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Démarrer la tampon de sortie</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-comment">// Sortie de données analogiques,Habituellement, c'est une tâche de longue date</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Chargement des données...<br>"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_flush</span></span><span>(); </span><span><span class="hljs-comment">// Envoyez immédiatement des données au navigateur</span></span><span>
</span><span><span class="hljs-comment">// Supposons que vous ayez plusieurs étapes pour gérer</span></span><span>
</span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">2</span></span><span>); </span><span><span class="hljs-comment">// Simulation en attente</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Progrès de chargement: 50%<br>"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_flush</span></span><span>(); </span><span><span class="hljs-comment">// Envoyez immédiatement des données au navigateur</span></span><span>
</span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">2</span></span><span>); </span><span><span class="hljs-comment">// Simulation en attente</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Le chargement est complet!<br>"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_flush</span></span><span>(); </span><span><span class="hljs-comment">// La dernière étape,Envoyer des données au navigateur</span></span><span>
</span><span><span class="hljs-comment">// Éteindre la tampon de sortie</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_end_flush</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Dans le code ci-dessus, ob_start () démarre le mécanisme de tampon de sortie. Chaque fois que Ob_flush () est appelé, les données du tampon seront immédiatement envoyées au navigateur. La fonction Sleep () simule le retard pendant le chargement. De cette façon, le navigateur peut afficher la progression de chaque étape en temps réel sans attendre que le script soit exécuté avant d'afficher les résultats.
Par exemple, dans un système de surveillance, vous devrez peut-être afficher certaines mesures clés en temps réel (comme l'utilisation du processeur, l'utilisation de la mémoire, etc.). Avec ob_flush (), vous pouvez vous assurer que ces données sont immédiatement présentées à l'utilisateur lorsqu'ils sont mis à jour sans décalage ni décalage.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Surveiller les données en temps réel du système<br>"</span></span><span>;
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> < </span><span><span class="hljs-number">100</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Données actuelles:<span class="hljs-subst">{$i}</span></span></span><span>%<br>";
</span><span><span class="hljs-title function_ invoke__">ob_flush</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">flush</span></span><span>(); </span><span><span class="hljs-comment">// Rendre les données envoyées davantage au navigateur</span></span><span>
</span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">ob_end_flush</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Dans une application de chat en direct, le message de l'utilisateur doit être affiché immédiatement aux autres utilisateurs. En utilisant ob_flush () , l'affichage du navigateur peut être actualisé immédiatement après l'envoi d'un message pour assurer la rapidité de la transmission d'informations.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-literal">true</span></span><span>) {
</span><span><span class="hljs-variable">$message</span></span><span> = </span><span><span class="hljs-string">"Nouvelles nouvelles:"</span></span><span> . </span><span><span class="hljs-title function_ invoke__">rand</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">100</span></span><span>); </span><span><span class="hljs-comment">// Simuler le message en temps réel</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$message</span></span><span> . </span><span><span class="hljs-string">"<br>"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_flush</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">flush</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">2</span></span><span>); </span><span><span class="hljs-comment">// Fréquence de mise à jour des messages simulés</span></span><span>
}
</span><span><span class="hljs-title function_ invoke__">ob_end_flush</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Dans les applications de diffusion en direct, les cadres vidéo et les données en temps réel (telles que le nombre de téléspectateurs, le nombre de likes, etc.) doivent être mis à jour en temps opportun. Grâce à ob_flush () , il peut être assuré que le navigateur n'attend pas que toutes les transmissions de données se terminent, mais les affiche en segments pour améliorer l'expérience utilisateur.
Bien que Ob_flush () puisse améliorer considérablement les performances de sortie en temps réel des pages Web, certaines notes doivent être gardées à l'esprit:
Cache de navigateur : le navigateur peut cacher du contenu, ce qui fait que certains contenus ne sont pas affichés immédiatement. Le cache peut être obligé de se rafraîchir via flush () et ob_flush () .
Impact des performances : les rafraîchissements fréquents peuvent mettre un fardeau supplémentaire sur le serveur, en particulier lorsqu'il existe un grand nombre de demandes simultanées. Il doit être utilisé raisonnablement selon le scénario réel.
Problèmes de compatibilité : tous les serveurs Web et les navigateurs ne prennent pas en charge un actualisation instantanée. Des tests sont nécessaires pour assurer la compatibilité.
Cache client : certains navigateurs peuvent toujours mettre en cache le contenu de sortie. Pour le moment, vous devez utiliser des en-têtes HTTP appropriés, tels que le contrôle du cache: sans cache pour désactiver le cache.
Grâce à l'OB_Flush () et au mécanisme de mise en mémoire tampon de sortie, nous pouvons optimiser la sortie de données en temps réel de PHP, ce qui rend les pages Web plus lisses pendant le chargement, en évitant les problèmes de retard causés par le retard ou la transmission de données importantes. Que ce soit dans la surveillance des données en temps réel, les systèmes de chat ou les applications de diffusion en direct, l'utilisation rationnelle d' Ob_flush () peut améliorer considérablement l'expérience utilisateur. Cependant, lors de l'utilisation, les performances du serveur et la compatibilité du navigateur doivent également être prises en compte pour éviter les déchets de ressources ou les problèmes de performances causés par des rafraîchissements fréquents.