[spip-dev] Envoyer les pages fragment par fragment...

Bonjour,

Il est maintenant relativement connu quand on s'intéresse aux performances des sites web qu'envoyer le HTML fragment par fragment permet d'améliorer la performance perçue par l'utilisateur :
http://www.stevesouders.com/blog/2009/05/18/flushing-the-document-early/

Mais comment faire ça avec SPIP ? Est-ce que quelqu'un l'a déjà fait ?

Si j'insère des "ob_end_flush()" dans mon squelette entre le <head> et le <body> par exemple, comment va se comporter le pipeline affichage_final, par exemple ?

Si c'est faisable, est-il envisageable d'automatiser cela dans Zpip, éventuellement ?

-Nicolas

Tu veux parler de http://www.spip-blog.net/Ajax-Parallel-Loading-accelerer-un-site-SPIP.html et de http://www.spip-contrib.net/Zpip-blocs-de-page-et-Ajax ?

Bonjour,

Il est maintenant relativement connu quand on s'intéresse aux performances des sites web qu'envoyer le HTML fragment par fragment permet d'améliorer la performance perçue par l'utilisateur :
Flushing the Document Early | High Performance Web Sites

Je note que Steve Souders commence bien par expliquer que la génération du document HTML ne prend en général que 10% à 20% du temps total de chargement de la page, et que dans le cas contraire, il peut être intéressant de flusher ...

Dans le cas de SPIP, on s'applique à bien rester sous ce seuil de 10 à 20%, et le flush n'apporte pas grand chose dans ce cas.
Sinon, si tu as des pages lourdes, et que tu veux vraiment envoyer par morceaux,
c'est plutot APL que je propose d'utiliser en effet.

Mais comment faire ça avec SPIP ? Est-ce que quelqu'un l'a déjà fait ?

Si j'insère des "ob_end_flush()" dans mon squelette entre le <head> et le <body> par exemple, comment va se comporter le pipeline affichage_final, par exemple ?

Ça va carrément mettre le bazar (voire planter, ou dans le meilleur des cas ne rien faire)

Cédric

Non, pas du tout.

Il est maintenant relativement connu quand on s'intéresse aux performances des sites web qu'envoyer le HTML fragment par fragment permet d'améliorer la performance perçue par l'utilisateur :
Flushing the Document Early | High Performance Web Sites

Je note que Steve Souders commence bien par expliquer que la génération du document HTML ne prend en général que 10% à 20% du temps total de chargement de la page, et que dans le cas contraire, il peut être intéressant de flusher ...

Effectivement.

J'ai retrouvé le vrai article que je voulais citer initialement :

Dans le cas de SPIP, on s'applique à bien rester sous ce seuil de 10 à 20%, et le flush n'apporte pas grand chose dans ce cas.

Il apporte un rendu progressif, qui évite le syndrome de l'attente frustrante devant une page blanche. Il faut mieux attendre en tout 5 seconde, mais en voyant la page se construire progressivement dès la première seconde, qu'attendre 3 secondes devant du blanc avant de tout avoir soudainement.

Sinon, si tu as des pages lourdes, et que tu veux vraiment envoyer par morceaux, c'est plutot APL que je propose d'utiliser en effet.

La page (presque) blanche fournie aux utilisateurs sans JS me gêne un peu, sinon j'aurais effectivement adopté APL...

Mais comment faire ça avec SPIP ? Est-ce que quelqu'un l'a déjà fait ?
Si j'insère des "ob_end_flush()" dans mon squelette entre le <head> et le <body> par exemple, comment va se comporter le pipeline affichage_final, par exemple ?

Ça va carrément mettre le bazar (voire planter, ou dans le meilleur des cas ne rien faire)

Donc ce serait top que SPIP s'occupe lui-même de cette diffusion progressive du HTML... :wink:

-Nicolas

Il est maintenant relativement connu quand on s'intéresse aux performances des sites web qu'envoyer le HTML fragment par fragment permet d'améliorer la performance perçue par l'utilisateur :
Flushing the Document Early | High Performance Web Sites

Je note que Steve Souders commence bien par expliquer que la génération du document HTML ne prend en général que 10% à 20% du temps total de chargement de la page, et que dans le cas contraire, il peut être intéressant de flusher ...

Effectivement.

J'ai retrouvé le vrai article que je voulais citer initialement :
Progressive rendering via multiple flushes / Stoyan's phpied.com

Dans le cas de SPIP, on s'applique à bien rester sous ce seuil de 10 à 20%, et le flush n'apporte pas grand chose dans ce cas.

Il apporte un rendu progressif, qui évite le syndrome de l'attente frustrante devant une page blanche. Il faut mieux attendre en tout 5 seconde, mais en voyant la page se construire progressivement dès la première seconde, qu'attendre 3 secondes devant du blanc avant de tout avoir soudainement.

Sinon, si tu as des pages lourdes, et que tu veux vraiment envoyer par morceaux, c'est plutot APL que je propose d'utiliser en effet.

La page (presque) blanche fournie aux utilisateurs sans JS me gêne un peu, sinon j'aurais effectivement adopté APL...

heu non tu as pas du tester une version récente. Les utilisateurs sans js ont une page complète en un hit, à l'ancienne.

Mais comment faire ça avec SPIP ? Est-ce que quelqu'un l'a déjà fait ?
Si j'insère des "ob_end_flush()" dans mon squelette entre le <head> et le <body> par exemple, comment va se comporter le pipeline affichage_final, par exemple ?

Ça va carrément mettre le bazar (voire planter, ou dans le meilleur des cas ne rien faire)

Donc ce serait top que SPIP s'occupe lui-même de cette diffusion progressive du HTML... :wink:

Je vois pas de solution viable et compatible avec un certain nombre de fonctionnalités.

Cédric

Sinon, si tu as des pages lourdes, et que tu veux vraiment envoyer par morceaux, c'est plutot APL que je propose d'utiliser en effet.

La page (presque) blanche fournie aux utilisateurs sans JS me gêne un peu, sinon j'aurais effectivement adopté APL...

heu non tu as pas du tester une version récente. Les utilisateurs sans js ont une page complète en un hit, à l'ancienne.

Non, j'ai bien testé — en tout cas je suppose que SPIP Contrib est à jour — et la première page est d'abord presque vide, puis on redirige en posant un cookie pour les fois suivantes. C'est bien la première fois qui me gène, parce que c'est le nouvel arrivant qu'il faut réussir à garder là...

Mais comment faire ça avec SPIP ? Est-ce que quelqu'un l'a déjà fait ?
Si j'insère des "ob_end_flush()" dans mon squelette entre le <head> et le <body> par exemple, comment va se comporter le pipeline affichage_final, par exemple ?

Ça va carrément mettre le bazar (voire planter, ou dans le meilleur des cas ne rien faire)

Donc ce serait top que SPIP s'occupe lui-même de cette diffusion progressive du HTML... :wink:

Je vois pas de solution viable et compatible avec un certain nombre de fonctionnalités.

SPIP fait bien un envoi de la page en HTML, au final, donc il doit bien y avoir moyen d'y glisser quelques "ob_flush(); flush();", non ?

-Nicolas

Sinon, si tu as des pages lourdes, et que tu veux vraiment envoyer par morceaux, c'est plutot APL que je propose d'utiliser en effet.

La page (presque) blanche fournie aux utilisateurs sans JS me gêne un peu, sinon j'aurais effectivement adopté APL...

heu non tu as pas du tester une version récente. Les utilisateurs sans js ont une page complète en un hit, à l'ancienne.

Non, j'ai bien testé — en tout cas je suppose que SPIP Contrib est à jour — et la première page est d'abord presque vide, puis on redirige en posant un cookie pour les fois suivantes. C'est bien la première fois qui me gène, parce que c'est le nouvel arrivant qu'il faut réussir à garder là...

Quel navigateur donc ? Car si tu n'as pas javascript, il y a une meta refresh dans un <noscript> qui déclenche le rechargement.
Mais oui il est clair que dans ce scenario on défavorise le nouvel arrivant sans js par rapport aux autres.

Mais comment faire ça avec SPIP ? Est-ce que quelqu'un l'a déjà fait ?
Si j'insère des "ob_end_flush()" dans mon squelette entre le <head> et le <body> par exemple, comment va se comporter le pipeline affichage_final, par exemple ?

Ça va carrément mettre le bazar (voire planter, ou dans le meilleur des cas ne rien faire)

Donc ce serait top que SPIP s'occupe lui-même de cette diffusion progressive du HTML... :wink:

Je vois pas de solution viable et compatible avec un certain nombre de fonctionnalités.

SPIP fait bien un envoi de la page en HTML, au final, donc il doit bien y avoir moyen d'y glisser quelques "ob_flush(); flush();", non ?

non, car du coup plus moyen de gérer les traitement finaux (pipeline affichage_final, gestion des headers envoyés a retardement, ...)

Cédric

Non, j'ai bien testé — en tout cas je suppose que SPIP Contrib est à jour — et la première page est d'abord presque vide, puis on redirige en posant un cookie pour les fois suivantes. C'est bien la première fois qui me gène, parce que c'est le nouvel arrivant qu'il faut réussir à garder là...

Quel navigateur donc ?

Firefox 3.6 sur Mac.

Car si tu n'as pas javascript, il y a une meta refresh dans un <noscript> qui déclenche le rechargement.

Oui, mais ce n'est pas immédiat.

Mais oui il est clair que dans ce scenario on défavorise le nouvel arrivant sans js par rapport aux autres.

Bon, après, je ne sais pas du tout combien j'ai personnellement de visiteurs sans JS, je pourrais sans doute tirer profit sans problème de APL, mais dans le cadre d'une réflexion plus générale, je trouve cela dommage.

Mais comment faire ça avec SPIP ? Est-ce que quelqu'un l'a déjà fait ?
Si j'insère des "ob_end_flush()" dans mon squelette entre le <head> et le <body> par exemple, comment va se comporter le pipeline affichage_final, par exemple ?

Ça va carrément mettre le bazar (voire planter, ou dans le meilleur des cas ne rien faire)

Donc ce serait top que SPIP s'occupe lui-même de cette diffusion progressive du HTML... :wink:

Je vois pas de solution viable et compatible avec un certain nombre de fonctionnalités.

SPIP fait bien un envoi de la page en HTML, au final, donc il doit bien y avoir moyen d'y glisser quelques "ob_flush(); flush();", non ?

non, car du coup plus moyen de gérer les traitement finaux (pipeline affichage_final, gestion des headers envoyés a retardement, ...)

Donc c'est au niveau d'affichage_final qu'il faut intervenir peut-être... Rajouter pour commencer un flush() entre </head> et <body>

-Nicolas

Je confirme le pages blanches de Contrib, vraiment pas agréables, qui durent parfois suffisamment trop longtemps pour que je j'aille cliquer ailleurs, sans comprendre que ça va finir par arriver.
Avec Firefox 3.6 sur Mac également.

-- Romy

Sauf que je n'y arrive pas... :wink:

J'ai bien mis cela dans mes_fonctions.php :

$GLOBALS['z_blocs']=array('contenu', 'navigation', 'extra', 'head');
define('_Z_AJAX_PARALLEL_LOAD', 'contenu,extra');

J'ai viré tous mes cookies, je ne suis pas connecté, et pourtant j'obtiens directement toute la page, sans mécanisme APL...

J'ai surchargé structure.html et body.html mais normalement ça semble bon :
http://gasteroprod.com/themes/gp2010/structure.html
http://gasteroprod.com/themes/gp2010/body.html

-Nicolas

il y a 2 choses

- si javascript *désactivé* dans le navigateur (oui : ça existe) le *premier* appel à spip-contrib affiche un *contenu* vide avec un lien "cliquez ici si la page reste incomplète bla bla bla" comme on peut voir ici : http://www.circaete.net/contrib/latence.jpg

cet affichage (page blanche) peut durer oui.
il ne se produit qu'au *premier* accès à spip-contrib

- avec javascript activé dans le navigateur (si si : il y a encore des fous qui vivent dangereusement) la parallèle loading peut effectivement prendre un certain temps durant lequel le *contenu* reste vide comme on peut le voir ici : http://www.circaete.net/contrib/latence_2.jpg
et là aussi ça peut durer...

vouali voualou

Bon, après, je ne sais pas du tout combien j'ai personnellement de visiteurs sans JS, je pourrais sans doute tirer profit sans problème de APL [...]

Sauf que je n'y arrive pas... :wink:

J'ai bien mis cela dans mes_fonctions.php :

C'est pas faute d'avoir écrit dans la documentation

de mettre la directive dans 'mes_options.php' :slight_smile:

$GLOBALS['z_blocs']=array('contenu', 'navigation', 'extra', 'head');

cette déclaration n'est utile que si tu veux definir d'autres blocs. Pour les blocs par defaut, tu peux t'omettre.

define('_Z_AJAX_PARALLEL_LOAD', 'contenu,extra');

Cédric

Bon, après, je ne sais pas du tout combien j'ai personnellement de visiteurs sans JS, je pourrais sans doute tirer profit sans problème de APL [...]

Sauf que je n'y arrive pas... :wink:

J'ai bien mis cela dans mes_fonctions.php :

C'est pas faute d'avoir écrit dans la documentation
Zpip, blocs de page et Ajax - SPIP-Contrib

de mettre la directive dans 'mes_options.php' :slight_smile:

Je cite le texte :

« Zpip permet cela au moyen de la déclaration d’une variable globale. Dans votre fichier mes_fonctions, il suffit de lister les blocs que vous voulez utiliser sur votre projet. »

$GLOBALS['z_blocs']=array('contenu', 'navigation', 'extra', 'head');

cette déclaration n'est utile que si tu veux definir d'autres blocs. Pour les blocs par defaut, tu peux t'omettre.

OK

-Nicolas

oui pour la déclaration des blocs, mais, je cite aussi :

"Pour activer le chargement séparés de certains blocs, il suffit de les déclarer dans un define dans votre fichier mes_options :

  1. // activer le chargement parallele sur les blocs contenu et more

  2. define(’_Z_AJAX_PARALLEL_LOAD’,‹ contenu,more ›);

"

Cédric

Aaaaah, j’imaginais pas que ça puisse être séparé, j’ai pas fait gaffe à la suite… mea culpa… :wink:

Ca marche bien finalement, donc : http://gasteroprod.com/

Bonsoir,

Juste en passant cette page : http://gasteroprod.com/spip.php?page=tags
ne se charge pas sur FF3.6.10 sur Gnu/nux. Peut être la même chose que
la page 404 sur spip-contrib

:slight_smile: