2010-06-18 5 views
1

Je peux voir l'utilisation de ob_start avec le jeu de paramètres output_callback mais je ne peux pas voir l'utilisation de ob_start lors de l'appel sans aucun paramètre défini du tout.Quel est le point d'utiliser ob_start sans aucun paramètre dans PHP

Quel est le point de désactivation de sortie à jeter plus tard toute la sortie à la fois? Cela n'utilise-t-il pas plus de mémoire (côté serveur) et de téléchargements lents (côté client) puisque le téléchargement commence seulement après que la page soit entièrement rendue (ou quand ob_end_flush est appelée)?

ob_start(); 
for ($i = 1; $i <= 15; $i++) 
{ 
    echo $i, ' '; 
    sleep(1); 
} 
ob_end_flush(); 

Tout le monde peut me donner l'utilisation/avantages de l'utilisation ob_start() sans paramètres définis (comme dans l'extrait ci-dessus).

Répondre

4

Une des raisons est de "saisir" la sortie d'une petite section de code. Donc, disons que vous avez un morceau de code indépendant que vous voulez exécuter, mais que vous ne voulez pas simplement le sortir directement. Ce que vous pouvez faire, c'est

ob_start(); 
include 'file.php'; 
$output = ob_get_clean(); 

Je vais vous donner un exemple concret. Supposons que vous construisez un programme d'installation pour une application. Et dans le cadre de ce programme d'installation, vous voulez afficher les informations PHP actuelles (les données de phpinfo()). Mais, vous voulez intégrer cette information avec le reste de la page (plutôt que d'utiliser un cadre). Donc, ce que vous pouvez faire est de saisir la sortie de phpinfo() avec un tampon de sortie, le modifier, puis l'afficher où vous voulez dans votre fichier de modèle.

ob_start(); 
phpinfo(); 
$info = ob_get_clean(); 
//Massage the output, remove the doctype, html, head, and body tags 
echo $info; 

Je l'utilise également avec des fichiers de vue. Dans la classe View, la méthode __toString() rend réellement la vue. Mais puisque __toString() devrait renvoyer une chaîne au lieu de l'écho, j'utilise la mise en tampon de sortie pour capturer le modèle et le retourner ...

2

Si vous avez un script PHP qui utilise echo pour sortir en petits morceaux, il s'avère que le script PHP s'exécute plus rapidement si vous mettez en mémoire tampon avec ob_start(), puis videz le tout lorsque vous avez terminé.

(note: c'est par rapport seulement des blogs par les développeurs PHP de base, je ne l'ai pas tester moi-même donc je n'ai pas de chiffres précis pour combien plus vite il est.)

Oui, il garde le tampon en mémoire mais quelle est la taille de votre sortie HTML? Probablement assez petit par rapport à la limite de mémoire de votre environnement PHP.

Oui, cela retarde la sortie jusqu'à ce que tout soit terminé, mais comme le PHP s'exécute plus vite, le temps total écoulé sera plus court. Le plus tôt votre thread Apache peut passer à une autre demande, le mieux pour l'évolutivité de votre site. Cela ne veut pas dire que chaque page bénéficie de la mise en mémoire tampon de sortie. L'avantage peut être insignifiant dans le script PHP typique qui est principalement du HTML statique avec quelques éléments variables.

0
  1. en vous assurant que vous ne recevez pas un « en-têtes déjà envoyés » erreur
  2. capture toutes les données html pour créer un fichier de cache

Je n'utiliseraient pour 2 car je pense que 1 devrait Cela n'arrivera jamais de toute façon

1

Une utilisation consisterait à empêcher l'envoi d'en-têtes PHP jusqu'à ce que le script soit prêt à envoyer son contenu, car cela vous permettrait de modifier vos en-têtes au fur et à mesure de la génération de votre sortie.

Lisez cet article sur la mise en mémoire tampon pour avoir plus d'idées sur la façon de l'utiliser. http://www.devshed.com/c/a/PHP/Output-Buffering-With-PHP/

Questions connexes