web-dev-qa-db-fra.com

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

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

182
Abhimanyu

Mise en mémoire tampon de sortie pour les développeurs Web, Guide du débutant :

Sans la mise en tampon de sortie (valeur par défaut), votre code HTML est envoyé au navigateur de manière fragmentée, à mesure que PHP traite par le biais de votre script. Avec la mise en tampon de sortie, votre code HTML est stocké dans une variable et envoyé au navigateur sous la forme d'un élément à la fin de votre script.

Avantages de la mise en tampon de sortie pour les développeurs Web

  • L'activation de la mise en mémoire tampon de sortie à elle seule réduit le temps nécessaire au téléchargement et au rendu de notre code HTML, car il n'est pas envoyé au navigateur par morceaux, car PHP traite le code HTML.
  • Toutes les choses fantaisistes que nous pouvons faire avec les chaînes PHP, nous pouvons maintenant le faire avec toute notre page HTML 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 de cookies, vous serez heureux de savoir que la mise en mémoire tampon de sortie est votre réponse.
248
ax.

La mise en tampon de sortie est utilisée par PHP pour améliorer les performances et effectuer quelques astuces.

  • Vous pouvez faire en sorte que PHP stocke toutes les sorties dans une mémoire tampon et les affiche toutes en même temps, ce qui améliore les performances du réseau. 

  • Vous pouvez accéder au contenu du tampon sans le renvoyer au navigateur dans certaines situations.

Considérons cet exemple:

<?php
    ob_start( );
    phpinfo( );
    $output = ob_get_clean( );
?>

L'exemple ci-dessus capture le résultat 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 des situations où vous souhaitez modifier les en-têtes après l'envoi du contenu.

Considérons cet exemple:

<?php
    ob_start( );
    echo "Hello World";
    if ( $some_error )
    {
        header( "Location: error.php" );
        exit( 0 );
    }
?>
62
Salman A

Les fonctions de contrôle de sortie vous permettent pour contrôler quand la sortie est envoyée depuis le scénario. Cela peut être utile dans plusieurs situations différentes, surtout si vous devez envoyer des en-têtes au navigateur après que votre script ait a commencé à produire des données. Le résultat Les fonctions de contrôle n'affectent pas les en-têtes envoyés en utilisant header () ou setcookie (), seules les fonctions telles que echo () et les données entre les blocs de PHP code.

http://php.net/manual/en/book.outcontrol.php

Plus de ressources:

Mise en mémoire tampon de sortie avec PHP 

9
Sarfraz

Je sais que c'est une vieille question mais je voulais écrire ma réponse pour les apprenants visuels. Je ne pouvais trouver aucun diagramme expliquant la mise en tampon de sortie sur le Web, alors j'ai créé quelque chose moi-même dans mspaint. 

Si la mise en mémoire tampon de sortie est désactivée, echo enverra immédiatement les données au navigateur.

 enter image description here

Si la mise en mémoire tampon de sortie est activée, une variable echo enverra des données à la mémoire tampon de sortie avant de les envoyer au navigateur. 

 enter image description here

phpinfo

Pour voir si la mise en mémoire tampon de sortie est activée/désactivée, veuillez vous référer à phpinfo dans la section principale. La directive output_buffering vous dira si la mise en mémoire tampon de sortie est activée/désactivée.

 enter image description here Dans ce cas, la valeur output_buffering est 4096, ce qui signifie que la taille de la mémoire 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 directive output_buffering. Il suffit de le trouver dans php.ini, de le modifier selon le paramètre de votre choix et de redémarrer le serveur Web. Vous pouvez trouver un échantillon de mon 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/fr/outcontrol.configuration.php

Exemple: ob_get_clean ()

Ci-dessous, vous pouvez voir comment capturer une echo et la manipuler avant de l'envoyer au navigateur. 

// Turn on output buffering  
ob_start();  

echo 'Hello World';  // save to output buffer

// Get content which is in the output buffer ...  
// ... and delete output buffer  
$output = ob_get_clean();  
$output = strtoupper($output); // manipulate the output  

echo $output;  // send to output stream / Browser

// OUTPUT:  
HELLO WORLD

Exemples: Hackingwithphp.com

Vous trouverez plus d'informations sur le tampon de sortie avec des exemples ici: 

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

5
Julian

Comme son nom l'indique, la mémoire tampon utilisée pour gérer l'affichage du résultat du script.

Voici un très bon tutoriel pour le sujet

4
nik
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. Ainsi, lorsqu'un tampon est actif, un autre ob_start () active un nouveau tampon. Ainsi, ob_end_flush () et ob_flush () n'envoient pas réellement 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-outout-buffering-in-php

1
sudip

UPDATE 2019. Si vous avez un serveur dédié et un disque SSD ou une NVM supérieure, 3.5GHZ. Vous ne devriez pas utiliser la mise en mémoire tampon pour créer un site Web chargé plus rapidement en 100ms-150ms.

Parce que le réseau est lent, il est plus lent que le script en 2019 avec des serveurs de performance (serveurs, mémoire, disque) et avec la mise en marche APC PHP :) Pour qu'un script généré nécessite parfois seulement 70 ms, seul le temps réseau est long, à partir de 10 ms à 150 ms de l'utilisateur-serveur situé. 

donc si vous voulez être rapide 150 ms, la mise en mémoire tampon ralentit, car nous avons besoin de plus de données de mémoire tampon de collecte, cela engendrera un coût supplémentaire Il y a 10 ans, lorsque le serveur créait un script 1s, il était utile.

S'il vous plaît soyez prudent output_buffering avoir limite si vous souhaitez utiliser jpg pour le charger peut vider automatiser et l'envoi de crash.

À votre santé.

Vous pouvez faire rapide river Ou Vous pouvez faire en toute sécurité tama :) 

0
Kamil Dąbrowski