2009-05-31 9 views
3

J'utilise toujours une variable de sortie en PHP où je rassemble tout le contenu avant de m'en faire l'écho. Ensuite, j'ai lu quelque part (je ne me souviens pas où, cependant) que vous obtenez les meilleures performances si vous divisez la variable de sortie en paquets et ensuite l'écho de chaque paquet au lieu de la variable de sortie entière.PHP echo performance

Comment est-ce vraiment?

Répondre

3

Si vous générez de très grandes chaînes avec écho, il est préférable d'utiliser plusieurs instructions d'écho.

Ceci est dû à la manière dont les données sont bufferisées sur TCP/IP. Nagle's algorithm


trouvé une note sur Php-bugs à ce sujet:
http://bugs.php.net/bug.php?id=18029

+0

Donc, vous recommandez de diviser la variable de sortie spécifiée sur une taille maximale et d'écho chaque pièce? – Ivar

+0

Si vous avez de bonnes raisons de croire que cela augmentera votre performance, oui je le fais. – Silfverstrom

+0

Eh bien, j'ai mentionné ma raison dans mon premier post - mettre tout le contenu à une seule variable pourrait être une raison assez forte. – Ivar

0

Je pense qu'une meilleure solution est pré senté ici ....

http://wonko.com/post/seeing_poor_performance_using_phps_echo_statement_heres_why#comment-5606

........

Les gars, je pense que je rétréci encore plus loin! Comme cela a été dit précédemment, la mise en mémoire tampon PHP laissera PHP courir jusqu'à la fin de votre script, mais après, il continuera à "se bloquer" en essayant de transmettre toutes ces données à Apache.

Maintenant, j'ai été capable, non seulement de mesurer cela (voir le commentaire précédent), mais d'éliminer réellement la période d'attente à l'intérieur de PHP. Je l'ai fait en augmentant SendBuffer d'Apache avec la directive SendBufferSize.

Cela pousse les données hors PHP plus rapidement. Je suppose que l'étape suivante consisterait à l'extraire d'Apache plus rapidement, mais je ne suis pas sûr qu'il existe réellement une autre couche configurable entre Apache et la bande passante réseau brute.

0

Ceci est ma version de la solution, elle ne résout que si la connexion n'est pas annulée. Si l'utilisateur se déconnecte, la fonction se ferme.

<?php 
function _echo(){ 
    $args = func_get_args(); 
    foreach($args as $arg){ 
     $strs = str_split($arg, 8192); 
     foreach($strs as $str){ 
      if(connection_aborted()){ 
       break 2; 
      } 
      echo $str; 
     } 
    } 
} 
_echo('this','and that','and more','and even more'); 
_echo('or just a big long text here, make it as long as you want');