- encoding (utf8)
- eof_ending (saut le ligne en fin de fichier)
- elseif (pas else if)
- function_call_space (espaces sur fonctions)
- function_declaration (pareil)
- function_typehint_space (pareil)
Je profite de cette écriture massive pour normaliser quelque chose de trompeur lorsqu'on compare deux versions, savoir l'usage de " ou ' dans le premier argument de define et defined. Comme les chaînes entre apostrophes sont plus rapidement analysées que celles entre guillemets, je choisis l'apostrophe.
Dépot obtenu avec le script Shell:
{{{
a=$(find . -name "*.php" |grep -v extensions/ | grep -v /config/ | grep -v index.php | grep -v public.php | grep -v prive.php )
echo -n "Fichiers: "
echo $a|wc -w
for i in $a
do
sed -f ~/Sites/spip/spip.sed $i > /tmp/f.php
if diff -q $i /tmp/f.php
then
:
else
diff $i /tmp/f.php
# echo $i; php /tmp/f.php
# mv /tmp/f.php $i
fi
done
}}}
et le script Sed:
{{{
s/Copyright (c) 2001-20../Copyright (c) 2001-2011/
s,\(if [(]!*\)*\(defined* *[(]\)"\([^"]*\)"\(.*\);[[:space:]]*[#/]*.*$,\1\2'\3'\4;,
}}}
- la plus simple: rajouter dans leurs fichiers le {{{include_spip('inc/minipres/')}}} qui sera bientot retiré de ecrire/index.php
- la plus pertinente: tester chacun de ces fichiers pour regarder s'ils ont besoin ou non de ces 130Ko. Pour ce faire on peut utiliser le shell-script suivant, où la variable {{{session}}} doit etre affectée à une session valide sur votre machine:
#!/bin/sh
session="require('../tmp/sessions/521_0a154a3fdb1dfa9443d8cec28e7c5743.php');"
for i in ??*.php
do
z=../_$i.php
sed "s,<\?php,<\?php require 'inc_version.php';spip_connect();include_spip('inc/sessions');$session," $i > $z
f=$(basename $i .php)
echo "<?php exec_${f}_dist(); ?>" >> $z
echo ">>>>>>>>>>>>>$i"
php -q $z |grep Fatal
rm $z
done
Il faut aussi executer ce script avec {{{session=''}}} pour bien faire. Les messages de fonctions indéfinies qui pourraient arriver pendant ces exécutions signalent qu'une au moins des 4 inclusions éliminées est indispensable au script considéré, il faut alors l'ajouter à l'endroit approprié.
Le présent dépot ajoute les inclusions repérées par ce shell-script. Elle sont donc superflues jusqu'au remplacement de inc/minipres par inc/lang dans index.php.
Cette simplification a été rendue possible en inversant le chantier prévu lors de la [7310]: les scripts en réponse Ajax utilisent echo, via ajax_retour. Un fichier index.php comportant l'unique echo de tout le code PHP de l'espace privé reste l'objectif final, mais il est préférable d'unifier d'abord ainsi, et de basculer lorsque chaque script de exec/ ne comportera plus qu'un seul echo.
- le calcul de l'attribut onclick n'était pas réinitialisé en début de la boucle PHP, du coup le code JS du clic sur la N-ieme rubrique du menu faisait N appels à Ajax. C'était carrément faux lorsqu'en plus la rubrique n'avait pas d'enfant (le menu renvoyé donnait les fils de la rubrique précédente), autrement, le dernier étant le bon, c'était invisible, mais ça explique la lenteur et le besoin d'appeler la methode .abort dans charger_id_url, ce qui devrait pouvoir sauter maintenant.
- optimisation de la requete SQL et beaucoup de calculs redondants dans la boucle et l'appel récursif.
- surtout: charger_id_url a pour 3e arg non plus une chaine sur laquelle appliquée Eval, mais une fonction qui est invoquée: ça évite le phénomène de capture de variable et accélère. AjaxSqueeze admet aussi un tel argument ce qui devrait permettre d'unifier les 2 à terme.
Autrement dit la seule chose qui distingue actuellement un script Ajax d'un autre, c'est que sa fonction exec_F retourne le flux à envoyer au client tandis que les autres font directement des echo. En calant tout le monde sur le premier comportement, tout script pourra alors s'exécuter en asynchrone, il suffira de mettre var_ajax=1 dans les parametre pour avoir les deux compléments indiqués ci-dessus (mais ils devraient sans doute s'intégrer aussi aux scripts à terme).
C'est la question de l'interface de programmation d'Ajax qui est posée.
En attendant de la stabiliser, le fichier index.php prend à sa charge l'aiguillage et le traitement opérés auparavant par ajax_page qui a été retiré du dépot, son contenu étant réparti en autant de fichiers inc/ajax_F.php qu'il contenait de fonctions F.
Le mode d'appel est provisoirement encore "ecrire/?exec=ajax_page&fonction=F" en attendant mieux.
- ne plus utiliser la forme: list($x) = spip_query("SELECT...
- faire apparaitre explicitement FROM, WHERE etc si présent
- avoir tout l'appel sur une seule ligne, terminée par ";".
renomme_en_exec_et_en_php ()
{
mv index.php3 i3;
mv index.php i;
mv forum.php3 f;
mv statistiques.php3 s;
for i in *.php*;
do
if [ -f inc_${i%3} ]; then
$MVCOMMAND inc_${i%3} exec_${i%3};
else
if [ -f inc_$i ]; then
$MVCOMMAND inc_$i exec_${i%3};
fi;
fi;
done;
mv i3 index.php3;
mv i index.php;
mv f forum.php3;
mv s statistiques.php3;
$MVCOMMAND inc_auth.php3 exec_auth.php;
$MVCOMMAND inc_accueil.php exec_accueil.php;
for i in inc_spip_action*;
do
$MVCOMMAND $i exec_${i#inc_};
done;
for i in inc_*.php3;
do
$MVCOMMAND $i ${i%3};
done;
$MVCOMMAND exec_config-contenu.php exec_config_contenu.php;
$MVCOMMAND exec_config-multilang.php exec_config_multilang.php;
$MVCOMMAND exec_config-fonctions.php exec_config_fonctions.php;
$MVCOMMAND exec_config-lang.php exec_config_lang.php
}
- virer les ifdefined_ECRIRE inutiles a cause include_ecrire et inopepants en PHP5
- les remplacer par ifnotdefined inc_version return pour renforcer la securite (suggestion de Moritz Naumann)
- mettre des include_ecrire pour tout ce qui n'est pas find_in_path
- signaler dans spip_log les fichiers non accessibles, par le biais de include_ecrire