Qu'est-ce que la mise en mémoire tampon de sortie?

201

Qu'est-ce que la mise en mémoire tampon de sortie et pourquoi l'utilise-t-on en PHP?

Abhimanyu
la source

Réponses:

274

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.
hache.
la source
6
+1. Voici un autre lien utile: php.net/manual/en/function.ob-start.php - également utile lorsque vous traitez une fonction qui fait écho à une valeur que vous préférez stocker dans une variable.
Cam
Est-ce que tout est mis en mémoire tampon jusqu'à la fin, ou est-ce que la page viendra en morceaux si j'ai une page vraiment longue?
zedoo
5
@zedoo si vous commencez la mise en mémoire tampon de sortie avec ob_start(), vraiment tout est mis en mémoire tampon. il existe un deuxième paramètre facultatif pour ob_start(), int $chunk_sizequi, 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.
hache.
12
Si vous obtenez «Avertissement: impossible de modifier les informations d'en-tête», cela signifie que vous devez d'abord auditer votre code car l'activation de la mise en mémoire tampon de sortie est un correctif du problème et non la cause. Quelque chose écrit avant son tour. Je ne suis donc pas d'accord, mais pas assez pour bousculer la réponse.
Glenn Plas
5
Je ne vois que des avantages d'utiliser la mise en mémoire tampon, alors pourquoi n'est-il pas activé par défaut en php?
Thomas Banderas
69

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.

  • Vous pouvez utiliser la mise en mémoire tampon de sortie dans les situations où vous souhaitez modifier les en-têtes après l'envoi de contenu.

Considérez cet exemple:

<?php
    ob_start( );
    echo "Hello World";
    if ( $some_error )
    {
        header( "Location: error.php" );
        exit( 0 );
    }
?>
Salman A
la source
Même question ici que pour Ax: ne démarre pas la mise en mémoire tampon de la sortie sans la désactiver plus tard, ce qui va entraîner votre script dans toutes sortes de problèmes?
Edward Stumperd
1
Le tampon est vidé lorsque vous appelez l'une des méthodes de vidage (par exemple 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.
Salman A
17

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 echodonnées seront immédiatement envoyées au navigateur.

entrez la description de l'image ici

Si la mise en mémoire tampon de sortie est activée, an echoenverra des données au tampon de sortie avant de les envoyer au navigateur.

entrez la description de l'image ici

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_bufferingdirective vous indiquera si la mise en mémoire tampon de sortie est activée / désactivée.

entrez la description de l'image ici Dans ce cas , la output_bufferingvaleur 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_bufferingdirective. 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.inici - 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_bufferingn'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 echoet 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:

http://www.hackingwithphp.com/13/0/0/output-buffering

julien
la source
9

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:

Tampon de sortie avec PHP

Sarfraz
la source
4

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

nik
la source
1
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

sudip
la source
0

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é :)

Kamil Dąbrowski
la source