Est ob_start()
utilisé pour output buffering
que les en-têtes soient mis en mémoire tampon et ne soient pas envoyés au navigateur? Suis-je logique ici? Sinon, pourquoi devrions-nous l'utiliser ob_start()
?
php
output-buffering
Aditya Shukla
la source
la source
ob_get_contents()
parob_get_clean()
et supprimerob_end_clean()
carob_get_clean()
remplit essentiellement les deux fonctions. Référence: php.net/manual/en/function.ob-get-clean.php (PHP 4> = 4.3.0, PHP 5)ob_start();
Est-ce correct? Que se passe-t-il s'il n'est pas activé?ob_end_clean
cela fonctionne comme un charme! Merci @Riley DuttonJ'utilise ceci pour pouvoir sortir de PHP avec beaucoup de HTML mais pas le rendre. Cela m'évite de le stocker sous forme de chaîne qui désactive le codage couleur IDE.
Au lieu de:
la source
ob_get_clean()
, pasob_end_clean()
La réponse acceptée ici décrit ce qui
ob_start()
ne fonctionne pas - pas pourquoi elle est utilisée (ce qui était la question posée).Comme indiqué ailleurs,
ob_start()
crée un tampon dans lequel la sortie est écrite.Mais personne n'a mentionné qu'il est possible d'empiler plusieurs tampons dans PHP. Voir ob_get_level ().
Quant au pourquoi ...
L'envoi de HTML au navigateur en plus gros morceaux offre un avantage en termes de performances grâce à une surcharge réseau réduite.
La transmission des données de PHP dans des segments plus importants offre un avantage en termes de performances et de capacité en réduisant le nombre de changements de contexte requis
Le passage de gros morceaux de données à mod_gzip / mod_deflate offre un avantage en termes de performances dans la mesure où la compression peut être plus efficace.
la mise en mémoire tampon de la sortie signifie que vous pouvez toujours manipuler les en-têtes HTTP plus tard dans le code
vider explicitement le tampon après la sortie de [head] .... [/ head] peut permettre au navigateur de commencer à marshaler d'autres ressources pour la page avant la fin du flux HTML.
La capture de la sortie dans un tampon signifie qu'elle peut être redirigée vers d'autres fonctions telles que le courrier électronique ou copiée dans un fichier en tant que représentation en cache du contenu
la source
Vous l'avez à l'envers. ob_start ne met pas les en-têtes en mémoire tampon, il met en mémoire tampon le contenu. L'utilisation
ob_start
vous permet de conserver le contenu dans un tampon côté serveur jusqu'à ce que vous soyez prêt à l'afficher.Ceci est couramment utilisé pour que les pages puissent envoyer des en-têtes après avoir «déjà» envoyé du contenu (c'est-à-dire décider de rediriger à mi-chemin du rendu d'une page).
la source
Je préfère:
la source
c'est pour clarifier davantage la réponse de JD Isaaks ...
Le problème que vous rencontrez souvent est que vous utilisez php pour sortir du HTML à partir de nombreuses sources php différentes, et ces sources sont souvent, pour une raison quelconque, sorties via différentes manières.
Parfois, vous avez du contenu HTML littéral que vous souhaitez afficher directement dans le navigateur; d'autres fois, la sortie est créée dynamiquement (côté serveur).
Le contenu dynamique sera toujours (?) Une chaîne. Vous devez maintenant combiner ce html dynamique stringifié avec n'importe quel html littéral direct à afficher ... dans une structure de nœud html significative.
Cela oblige généralement le développeur à encapsuler tout ce contenu direct à afficher dans une chaîne (comme l'a expliqué JD Isaak) afin qu'il puisse être correctement fourni / inséré en conjonction avec le HTML dynamique ... même si vous ne le faites pas vraiment veulent qu'il soit enveloppé.
Mais en utilisant les méthodes ob _ ##, vous pouvez éviter ce désordre de chaîne. Le contenu littéral est, à la place, sorti dans le tampon. Ensuite, en une seule étape facile, tout le contenu du tampon (tout votre html littéral) est concaténé dans votre chaîne dynamic-html.
(Mon exemple montre que du HTML littéral est sorti dans le tampon, qui est ensuite ajouté à une chaîne html ... regardez également l'exemple JD Isaaks pour voir l'encapsulation de chaîne de html).
la source
Cette fonction n'est pas réservée aux en-têtes. Vous pouvez faire beaucoup de choses intéressantes avec ça. Exemple: vous pouvez diviser votre page en sections et l'utiliser comme ceci:
Vous pouvez capturer la sortie générée ici et l'ajouter à deux endroits totalement différents de votre mise en page.
la source
Les éléments suivants ne sont pas mentionnés dans les réponses existantes: Configuration de la taille de la mémoire tampon HTTP Header et Nesting.
Configuration de la taille de la mémoire tampon pour ob_start:
Le code ci-dessus améliore les performances du serveur car PHP enverra de plus gros morceaux de données, par exemple 4Ko (sans appel ob_start, php enverra chaque écho au navigateur).
Si vous commencez à mettre en mémoire tampon sans la taille du bloc (c'est-à-dire un simple ob_start ()), la page sera envoyée une fois à la fin du script.
La mise en mémoire tampon de sortie n'affecte pas les en-têtes HTTP, ils sont traités de manière différente. Cependant, en raison de la mise en mémoire tampon, vous pouvez envoyer les en-têtes même après l'envoi de la sortie, car elle est toujours dans la mémoire tampon.
Bien expliqué ici: https://phpfashion.com/everything-about-output-buffering-in-php
la source
Non, vous vous trompez, mais la direction convient;)
L'Output-Buffering met en tampon la sortie d'un script. C'est (en bref) tout après
echo
ouprint
. Le problème avec les en-têtes est qu'ils ne peuvent être envoyés que s'ils ne sont pas déjà envoyés. Mais HTTP dit que les en-têtes sont les tout premiers de la transmission. Donc, si vous sortez quelque chose pour la première fois (dans une demande), les en-têtes sont envoyés et vous ne pouvez pas définir d'autres en-têtes.la source