Il peut arriver d’avoir besoin de générer une page web dont le contenu apparaisse au fur et à mesure. Dans la plupart des langages, c’est à la charge du développeur de gérer son flux de donnée. Ce qui est généralement caractérisé par l’appel de la fonction flush. On réalise alors du streaming.
On pourrait utiliser de l’AJAX, mais dans certains cas cette technique n’est pas approprié. Par exemple si votre traitement est long et que vous êtes capable de générer une partie du résultat, vous pouvez flusher votre stream à chaque itération.
1 – En PHP
En PHP, on pourrait faire comme ceci. La fonction str_pad
est utilisée pour ajouter des espaces blanc après la chaine que l’on souhaite affiché. On peut utiliser cette technique pour forcer les navigateurs internet à rafraichir la page car la plupart ne le fond qu’après réception d’une certaine quantité d’octets. Les espaces blancs n’étant pas interprété en HTML, cela n’aura aucune incidence sur la page affiché à l’utilisateur.
for($i=0;$<=10;$i++){ echo str_pad("loop: $i",5000); flush(); sleep(5); } |
2 – Avec Ruby on Rails
La version Ruby on Rails est plus simple, effectivement, il suffit d’appeler out.write
et le flush est automatique. Par contre il est nécessaire de générer l’affichage dans le contrôleur. La méthode ljust
de l’objet string
a la même utilité que str_pad
en PHP.
(1..10).each do |i| out.write "loop: #{i}" out.write " ".ljust(5000) sleep(5) end |