Réponses:
Tampon de sortie pour les développeurs Web, un guide pour débutants :
Sans mise en mémoire tampon de sortie (par défaut), votre code HTML est envoyé par morceaux au navigateur en tant que processus PHP via votre script. Avec la mise en mémoire tampon de sortie, votre code HTML est stocké dans une variable et envoyé au navigateur en une seule pièce à la fin de votre script.
Avantages de la mise en mémoire tampon de sortie pour les développeurs Web
- L'activation de la mise en mémoire tampon de sortie à elle seule diminue le temps nécessaire au téléchargement et au rendu de notre code HTML, car il n'est pas envoyé au navigateur en plusieurs parties pendant que PHP traite le code HTML.
- Tous les trucs fantaisistes que nous pouvons faire avec les chaînes PHP, nous pouvons maintenant faire avec notre page HTML entière en une seule variable.
- Si vous avez déjà rencontré le message "Avertissement: Impossible de modifier les informations d'en-tête - en-têtes déjà envoyés par (sortie)" lors de la configuration des cookies, vous serez heureux de savoir que la mise en mémoire tampon de sortie est votre réponse.
ob_start()
, vraiment tout est mis en mémoire tampon. il existe un deuxième paramètre facultatif pour ob_start()
, int $chunk_size
qui, s'il est défini, provoquera le vidage du tampon après tout appel de sortie qui entraînera la longueur du tampon à égaler ou dépasser cette taille.
La mise en mémoire tampon de sortie est utilisée par PHP pour améliorer les performances et effectuer quelques astuces.
Vous pouvez demander à PHP de stocker toutes les sorties dans un tampon et de les sortir toutes en même temps, améliorant ainsi les performances du réseau.
Vous pouvez accéder au contenu du tampon sans le renvoyer au navigateur dans certaines situations.
Considérez cet exemple:
<?php
ob_start( );
phpinfo( );
$output = ob_get_clean( );
?>
L'exemple ci-dessus capture la sortie dans une variable au lieu de l'envoyer au navigateur. output_buffering est désactivé par défaut.
Considérez cet exemple:
<?php
ob_start( );
echo "Hello World";
if ( $some_error )
{
header( "Location: error.php" );
exit( 0 );
}
?>
ob_flush()
ou ob_end_flush()
). Le contenu du tampon est également vidé à la fin de votre script, brutalement ou autrement, donc il ne devrait pas y avoir de problème.
Je sais que c'est une vieille question mais je voulais écrire ma réponse pour les apprenants visuels. Je n'ai trouvé aucun diagramme expliquant la mise en mémoire tampon de sortie sur le Web mondial, j'ai donc fait moi-même un diagramme dans Windows mspaint.exe
.
Si la mise en mémoire tampon de sortie est désactivée, les echo
données seront immédiatement envoyées au navigateur.
Si la mise en mémoire tampon de sortie est activée, an echo
enverra des données au tampon de sortie avant de les envoyer au navigateur.
phpinfo
Pour voir si la mise en mémoire tampon de sortie est activée / désactivée, reportez-vous à phpinfo dans la section principale. La output_buffering
directive vous indiquera si la mise en mémoire tampon de sortie est activée / désactivée.
Dans ce cas , la output_buffering
valeur est de 4096 ce qui signifie que la taille du tampon est de 4 Ko. Cela signifie également que la mise en mémoire tampon de sortie est activée sur le serveur Web.
php.ini
Il est possible d'activer / désactiver et de modifier la taille de la mémoire tampon en modifiant la valeur de la output_buffering
directive. Il vous suffit de le trouver php.ini
, de le modifier sur le paramètre de votre choix et de redémarrer le serveur Web. Vous pouvez trouver un échantillon de mes php.ini
ci - dessous.
; Output buffering is a mechanism for controlling how much output data
; (excluding headers and cookies) PHP should keep internally before pushing that
; data to the client. If your application's output exceeds this setting, PHP
; will send that data in chunks of roughly the size you specify.
; Turning on this setting and managing its maximum buffer size can yield some
; interesting side-effects depending on your application and web server.
; You may be able to send headers and cookies after you've already sent output
; through print or echo. You also may see performance benefits if your server is
; emitting less packets due to buffered output versus PHP streaming the output
; as it gets it. On production servers, 4096 bytes is a good setting for performance
; reasons.
; Note: Output buffering can also be controlled via Output Buffering Control
; functions.
; Possible Values:
; On = Enabled and buffer is unlimited. (Use with caution)
; Off = Disabled
; Integer = Enables the buffer and sets its maximum size in bytes.
; Note: This directive is hardcoded to Off for the CLI SAPI
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; http://php.net/output-buffering
output_buffering = 4096
La directive output_buffering
n'est pas la seule directive configurable concernant la mise en mémoire tampon de sortie. Vous pouvez trouver d'autres directives de mise en mémoire tampon de sortie configurables ici: http://php.net/manual/en/outcontrol.configuration.php
Exemple: ob_get_clean ()
Ci-dessous, vous pouvez voir comment capturer echo
et manipuler un avant de l'envoyer au navigateur.
// Turn on output buffering
ob_start();
echo 'Hello World'; // save to output buffer
$output = ob_get_clean(); // Get content from the output buffer, and discard the output buffer ...
$output = strtoupper($output); // manipulate the output
echo $output; // send to output stream / Browser
// OUTPUT:
HELLO WORLD
Exemples: Hackingwithphp.com
Plus d'informations sur le tampon de sortie avec des exemples peuvent être trouvées ici:
Les fonctions de contrôle de sortie vous permettent de contrôler quand la sortie est envoyée à partir du script. Cela peut être utile dans plusieurs situations différentes, en particulier si vous devez envoyer des en-têtes au navigateur après que votre script a commencé à produire des données. Les fonctions de contrôle de sortie n'affectent pas les en-têtes envoyés à l'aide de header () ou setcookie (), uniquement les fonctions telles que echo () et les données entre les blocs de code PHP.
http://php.net/manual/en/book.outcontrol.php
Plus de ressources:
Comme son nom l'indique ici, tampon mémoire utilisé pour gérer l'apparence de la sortie du script.
Voici un très bon tutoriel pour le sujet
ob_start(); // turns on output buffering
$foo->bar(); // all output goes only to buffer
ob_clean(); // delete the contents of the buffer, but remains buffering active
$foo->render(); // output goes to buffer
ob_flush(); // send buffer output
$none = ob_get_contents(); // buffer content is now an empty string
ob_end_clean(); // turn off output buffering
Les tampons peuvent être imbriqués, donc lorsqu'un tampon est actif, un autre ob_start()
active un nouveau tampon. Donc, ob_end_flush()
et ob_flush()
n'envoyez pas vraiment le tampon à la sortie, mais au tampon parent. Et seulement lorsqu'il n'y a pas de tampon parent, le contenu est envoyé au navigateur ou au terminal.
Bien expliqué ici: https://phpfashion.com/everything-about-output-buffering-in-php
MISE À JOUR 2019. Si vous avez un serveur dédié et un SSD ou mieux NVM, 3,5 GHz. Vous ne devez pas utiliser la mise en mémoire tampon pour créer un site Web chargé plus rapidement en 100 ms à 150 ms.
Parce que le réseau est lent à traiter le script dans le 2019 avec des serveurs de performance (serveurs, mémoire, disque) et à activer APC PHP :) Le script généré n'a parfois besoin que de 70 ms une autre fois, le réseau ne prend que 10 à 150 ms utilisateur-serveur.
Donc, si vous voulez être rapide de 150 ms, la mise en mémoire tampon ralentit, car vous avez besoin de données de tampon de collecte supplémentaires, cela coûte plus cher. Il y a 10 ans, lorsque le serveur faisait un script 1s, c'était utile.
Attention, output_buffering a une limite si vous souhaitez utiliser jpg pour le charger peut vider l'automatisation et bloquer l'envoi.
À votre santé.
Vous pouvez faire de la rivière rapide ou vous pouvez faire du tama en toute sécurité :)