[spip-dev] Nouveau compilateur et cacheur

Bonjour à tous,

Je viens de faire un gros commit sur le CVS, correspondant à la contrib
http://www.spip-contrib.net/ecrire/articles.php3?id_article=573
à laquelle je renvoie pour la description des nouveautés.
Cependant, 2 choses ne sont pas présentes par rapport à celle-ci,
car je préfère y aller doucement et les conditionner par des options:

- l'invalidation automatique des caches après modif/création d'articles/breves/rubriques
- l'inclusion 'in-line' des squelettes.

Le reste est présent: référence aux champs et aux variables d'URL à tous les coins de squelettes,
tables SQL externes traitées comme les standards si déclarées dans inc_serialbase, imbrication
des champs étendus, système de cache gérant plus fiablement les accès concurrents.

Vider votre cache avant installation, l'organisation y étant légèrement différente.

La contrib a été testée par une dizaine de personnes que je remercie pour leur intrépidité et leur patience. Malgré plusieurs correctifs apportés grâce à elle, il faut s'attendre néanmoins à des pbs
avec certaines configurations. Signalez tout problème sur cette liste, sans oublier d'indiquer

- l'OS et le navigateur de votre machine cliente, avec leur numéro de version;
- l'OS, les serveur http & sql et l'inteprète PHP de votre hébergeur, avec leur numéro de version;
- le fichier spip posant problème, avec si possible le numéro de ligne où ça coince;
- éventuellement le squelette avec lequel ça coince.

Je rappelle aussi que ces nouvelles fonctionnalités peuvent être remises en question si des pbs
imprévus trop graves apparaissent.

Bonne expérimentation à tous

esj

PS pour Arno*: j'ai pu intégrer tes dernières modifs (forum, login, tidy).

tables SQL externes traitées comme les standards si déclarées dans
inc_serialbase,

Ce qui me fait penser qu'on pourrait stocker dans spip_meta une valeur
md5(organisation de la base), qu'on validerait aisément pour détecter toute
modif dans inc_serialbase, amenant alors à une page disant "attention votre
base ne correspond pas tout à fait à sa description", et fournissant
éventuellement les outils pour faire la modif ?

-- Fil

Gros commit en effet, tout semble un peu cassé chez moi je vais essayer
d'y voir clair...

En attendant d'essayer de comprendre et d'avoir à nouveau un SPIP qui
fonctionne, juste un mot sur PHP5:

Fatal error: Cannot redeclare squelette_obsolete() (previously declared
in /home/patrice/html/spip_dev/spip/inc-cache.php3:13) in
/home/patrice/html/spip_dev/spip/inc-cache.php3 on line 26

Dans PHP5 le truc qui consiste à coder:
if (defined(_MY_CONSTANT)) return;

ne fonctionne plus dans la mesure où tout le code est quand même parsé
et donc les fonctions y figurant sont éventuellement redéclarées.

J'ignore si c'est un bug ou une feature (mais maintenant que la 5.0
officielle est sortie...). Il y a bien un bug ouvert depuis avril sur
bugs.php.net, mais pas de réponse pour l'instant.
http://bugs.php.net/bug.php?id=28025

SPIP (contrairement à Agora) a - pardon, avait jusqu'à ce matin, très
bien géré l'absence d'inclusion multiples. Ce serait (àmha) bien que
cela continue de peur que la version 1.7.2 soit la dernière à
fonctionner "out of the box" avec PHP5.

Pour l'instant je contourne (à la sauvage) avec:
if (defined(_MY_CONSTANT)) return;
else {le reste du code}

(dans inc-cache.php3 et inc-invalideur.php3)

Ceci dit, il y a aussi des choses qui continuent de fonctionner suite au
gros commit, toutefois il me manque du html:

un accès à sommaire.php3 ne me sort aucun code avant:

<script type='text/javascript'><!--
  var bouton_admin = "<div class=\'spip-admin\' dir=\'ltr\'><form
action=\'\/spip_dev\/spip\/index.php\'><input type=\'hidden\'
name=\'recalcul\' value=\'oui\'\/><input type=\'submit\'
value=\'Recalculer cette page\' class=\'spip_bouton\'
\/><\/form><\/div>";function admin()
{document.write(bouton_admin); document.close(); bouton_admin='';}
--></script>

donc pas de header, pas de déclaration html ni d'appels aux feuilles de
style, etc.

Enfin, une tentative d'accès à /ecrire/ me renvoie en tout et pour tout:

<script type='text/javascript'><!--
  function admin(){}
--></script>

Bref, on est pas couchés :wink:

Merci quand même et bonne journée,

Dans PHP5 le truc qui consiste à coder:
if (defined(_MY_CONSTANT)) return;

ne fonctionne plus

ouch, ça demande une réflexion de fond.

un accès à sommaire.php3 ne me sort aucun code avant:

<script type='text/javascript'><!--

Avec les squelettes standard
(i.e. commençant proprement par '<DOCTYPE .....><html ...><head ...>)
ce code est inclus juste après la balise <head ...>
Si le début n'est pas standard, il est mis en début de page en effet,
ce qui ne gene pas les navigateurs que j'ai testés pour ma part.
Je demande à nouveau que soit précisé les configurations utilisées.

esj

Fatal error: Cannot redeclare squelette_obsolete() (previously declared
in /home/patrice/html/spip_dev/spip/inc-cache.php3:13) in
/home/patrice/html/spip_dev/spip/inc-cache.php3 on line 26

Dans PHP5 le truc qui consiste à coder:
if (defined(_MY_CONSTANT)) return;

ne fonctionne plus dans la mesure où tout le code est quand même parsé
et donc les fonctions y figurant sont éventuellement redéclarées.

En fait je pense qu'il suffit de remplacer les include() par des
include_local() pour réparer ça. Tu peux vérifier ?

SPIP (contrairement à Agora) a - pardon, avait jusqu'à ce matin, très
bien géré l'absence d'inclusion multiples. Ce serait (àmha) bien que
cela continue de peur que la version 1.7.2 soit la dernière à
fonctionner "out of the box" avec PHP5.

:slight_smile:

Autre bug : chez moi les résultats de recherche sont surlignés dans la page
des résultats de recherche, ce qui n'est pas le comportement souhaité (il
faut les surligner dans les pages linkées depuis
        http://chao.local/~fil/spip/recherche.php3?recherche=site
c-à-d les pages
        http://chao.local/~fil/spip/article.php3?id_article=3709&var_recherche=site

Bref, ne pas confondre recherche et var_recherche

-- Fil

oui, très bonne idée.

esj

En fait je pense qu'il suffit de remplacer les include() par des
include_local() pour réparer ça. Tu peux vérifier ?

Ah ok, j'avais pas capté ça.
Je m'en occupe, parce que si j'y avais renoncé c'est pour des pbs de globalité
de variables qu'il faut vérifier une à une.

Autre bug : chez moi les résultats de recherche sont surlignés dans la page
des résultats de recherche, ce qui n'est pas le comportement souhaité (il
faut les surligner dans les pages linkées depuis
        http://chao.local/~fil/spip/recherche.php3?recherche=site
c-à-d les pages
        http://chao.local/~fil/spip/article.php3?id_article=3709&var_recherche=site

Bref, ne pas confondre recherche et var_recherche

Zut, ça non plus je n'avais pas capté.
Il y a une doc qq part sur la différence ?

esj

>Bref, ne pas confondre recherche et var_recherche

Zut, ça non plus je n'avais pas capté.
Il y a une doc qq part sur la différence ?

recherche : je cherche un mot dans le site
var_recherche : je veux surligner le mot en question

(var_recherche pourrait s'appeler var_surligne, donc). C'est var_... pour ne
pas avoir à recalculer la page.

-- Fil

Hello,

chez moi aussi c'est tout cassé, ça a l'air lié au multilinguisme en
tout cas.

Je vais essayer de regarder si je trouve vraiment ce que c'est et je
vous redis.

Pierre

> Dans PHP5 le truc qui consiste à coder:
> if (defined(_MY_CONSTANT)) return;
>
> ne fonctionne plus

ouch, ça demande une réflexion de fond.

Comme je le disais, toujours pas de réponse sur le bug ouvert. Meis je
ne peux m'empêcher de soupçonner la refonte du Zend Engine. On verra. En
l'état c'est pas la fin du monde pour SPIP. Agora est une autre
histoire.

Si le début n'est pas standard, il est mis en début de page en effet,
ce qui ne gene pas les navigateurs que j'ai testés pour ma part.
Je demande à nouveau que soit précisé les configurations utilisées.

Je ne crois pas que ce soit une question de navigateur (Firefox 0.9 dans
mon cas).

Pour être sur j'ai rechargé le CVS complet dans un nouveau répertoire,
donc même résultat.

J'ai qques soucis avec la focntion parser dans inc-html-squel.php3
l'erreur fréquente étant (ligne 321) que $all_res, en tant que premier
argument de array_merge, n'est pas un array.

J'ai aussi la sensation que les pages ne sont pas recalculées même avec
un $delais = 0

Toutefois, la réinstall du CVS semble m'avoir effacé la table spip_meta
(sans doute est-ce le comportement normal) mais comme je n'ai plus accès
au back-office, dus dur de savoir ce qui se passe...

Dans PHP5 le truc qui consiste à coder:
if (defined(_MY_CONSTANT)) return;

ne fonctionne plus

Comme je le disais, toujours pas de réponse sur le bug ouvert. Meis je
ne peux m'empêcher de soupçonner la refonte du Zend Engine. On verra. En
l'état c'est pas la fin du monde pour SPIP. Agora est une autre
histoire.

J'ai remplacé par include_local sur le CVS, ça devrait etre bon.

Si le début n'est pas standard, il est mis en début de page en effet,
ce qui ne gene pas les navigateurs que j'ai testés pour ma part.
Je demande à nouveau que soit précisé les configurations utilisées.

Je ne crois pas que ce soit une question de navigateur (Firefox 0.9 dans
mon cas).

c'est pour ça que j'ai demandé aussi d'indiquer les squelettes

J'ai qques soucis avec la focntion parser dans inc-html-squel.php3
l'erreur fréquente étant (ligne 321) que $all_res, en tant que premier
argument de array_merge, n'est pas un array.

exact. corrigé sur le CVS.

J'ai aussi la sensation que les pages ne sont pas recalculées même avec
un $delais = 0

Ca je ne pense pas, parce qu'une des nouveautés du cache, c'est qu'en cas de délai nul,
il n'écrit meme pas sur le disque.

esj

corrigé sur le CVS.

esj

J'ai remplacé par include_local sur le CVS, ça devrait etre bon.

Ça en à l'air en effet. Voilà qui va bien m'aider par ailleurs, merci et
merci à Fil.

c'est pour ça que j'ai demandé aussi d'indiquer les squelettes

le CVS, rien que le CVS: *-dist.html

Ca je ne pense pas, parce qu'une des nouveautés du cache, c'est qu'en
cas de délai nul,
il n'écrit meme pas sur le disque.

Si j'appelle:
http://localhost/spip_dev/spip/article.php3?id_article=1

Me renvoie une partie du html attendu...
Avec un cache vide, les répertoires sont créés mais pas de fichier en
effet.

De même:
http://localhost/spip_dev/spip/article.php3?id_article=1?recalcul=oui

ne créé aucun fichier cache mais ne renvoie aucun html valable:

<script type='text/javascript'><!--
  var bouton_admin = "<div class=\'spip-admin\' dir=\'ltr\'><form action=\'.\/ecrire\/articles.php3\'><input type=\'hidden\' name=\'id_article\' value=\'1\'\/><input type=\'submit\' value=\'Modifier cet article (1)\' class=\'spip_bouton\' \/><\/form><form action=\'\/spip_dev\/spip\/article.php3\'><input type=\'hidden\' name=\'id_article\' value=\'1\'\/><input type=\'hidden\' name=\'recalcul\' value=\'oui\'\/><input type=\'submit\' value=\'Recalculer cette page\' class=\'spip_bouton\' \/><\/form><\/div>";function admin()
{document.write(bouton_admin); document.close(); bouton_admin='';}
--></script>

Ne sois pas désolé, on a rien sans rien et c'est quand même pour ça
qu'on est là non ?

J'allais juste envoyer un mot pour dire "tout baigne c'est un plan de
cookies !!"

En fait mon ordi est configuré avec un nom de domaine en local
'patrice.vaio'. Il y avait confusion de cookies entre ce nom et
localhost.

Oh la suée ;-))

Bon je vais donc regarder tout ça plus sereinement. Il y a quelques
temps j'avais implanté une magouille (j'ai pas d'autre mot pour ça) qui
permettait d'ordonner des articles/rubriques/auteurs/etc. de manière
non-logique (volonté du graphiste par ex. et par opposition à un
classement temporel ou alphabétique) en faisant:

<BOUCLE_rub(RUBRIQUES) {rubrique_id IN 3,4,2,1}>

J'avais un peu modifié inc-calcul-squel.php3

Je peux facilement refaire ça maintenant ?

A+,

J'allais juste envoyer un mot pour dire "tout baigne c'est un plan de
cookies !!"

Zut, j'aurais du dire ça aussi dans mon annonce,
je me souviens que ça m'est arrivé aussi il y a longtemps. Donc:

EFFACER LES COOKIES AVANT L'INSTALL.

j'avais implanté une magouille (j'ai pas d'autre mot pour ça) qui
permettait d'ordonner des articles/rubriques/auteurs/etc. de manière
non-logique (volonté du graphiste par ex. et par opposition à un
classement temporel ou alphabétique) en faisant:

<BOUCLE_rub(RUBRIQUES) {rubrique_id IN 3,4,2,1}>

J'avais un peu modifié inc-calcul-squel.php3

Je peux facilement refaire ça maintenant ?

L'analyse des critères est faite dans inc-arg-squel.php3,
c'est là que tu dois prendre ça en compte.
Ensuite, si tu as pu exprimer ça par un "ORDER BY truc" ,
il te suffit d'affecter boucle->order à truc.

esj

Est-ce que ça concerne aussi les rédacteurs?

Si c'est le cas, il faut trouver un parade, sinon ça va bloquer le fonctionnement des sites sous SPIP qui feront la mise-à-jour.

ARNO*

Ca concerne tout ceux qui ont les "boutons admin" après connexion.
De meme que Fil proposaient de vider le cache automatiquement à l'install',
il faudrait aussi faire un setcookie false en fait.

esj

Non, un ORDER ne sert à rien dans ce cas (ou alors une option serait
l'usage de tables temporaires, j'y ai pensé sans plus).

Mon truc consiste à générer autant de boucles que nécessaire à partir
d'une seule dans le squelette. En d'autres mots:

<BOUCLE_rub(RUBRIQUES) {id_rubrique IN 3,1}>
du code html ici
</BOUCLE_rub>

me servait à éviter les redondances de HTML (ennuyeuses à modifier) du
genre:

<BOUCLE_rub_3(RUBRIQUES) {id_rubrique = 3}>
mon code une fois
</BOUCLE_rub_3>

<BOUCLE_rub_1(RUBRIQUES) {id_rubrique = 1}>
mon code encore une fois
</BOUCLE_rub_1>

ma modif se chargeait de générer la deuxième solution à partir de la
première lors de la phase 2 (cf. ton article sur contrib) du
compilateur... C'est pour ça que j'ai appelé ça une magouille :wink:
Top pratique, cela dit... j'avais fourni le patch à l'époque.

Mais bon, t'embête pas trop avec ça, je vais regarder à l'occasion...

>Si c'est le cas, il faut trouver un parade, sinon ça va bloquer le
>fonctionnement des sites sous SPIP qui feront la mise-à-jour.

Ca concerne tout ceux qui ont les "boutons admin" après connexion.
De meme que Fil proposaient de vider le cache automatiquement à
l'install',
il faudrait aussi faire un setcookie false en fait.

En quoi est-ce nécessaire de urger les cookies ? Autrement dit, d'où vient le bug ?

-- Fil

<BOUCLE_rub(RUBRIQUES) {id_rubrique IN 3,1}>
du code html ici
</BOUCLE_rub>

Je crois que le nouveau compilo accepte {id_rubrique=1}{id_rubrique=3} (dans
ce cas là il fait un OU logique au lieu d'un ET, si j'ai bien compris ; si
c'est bien ça, ça me paraît illogique, soit dit en passant, il vaudrait
mieux implanter {id_article IN 1,3}).

-- Fil