[SPIP Zone] Spip-listes gestion abonnés

Bonjour,
Ayant à mettre en place spip-listes sur une base de 5000 abonnés sur 130.000 visiteurs, le modèle utilisé pour la gestion des abonnés s'est immédiatement avéré impossible: plusieurs minutes pour charger une page quand ce n'était pas dépassement mémoire ou temps imparti au PHP.

J'ai du donc refondre quasi complètement les requètes utilisées. Essentiellement, on ne charge plus l'ensemble des auteurs mais uniquement la "tranche" demandée ou on utilise des requètes "groupées".
Je suis à peu près au top, je ne vois que la requete pour rechercher les types d'abonnement qui pourrait être encore hackée, mais au prix d'un LIKE pour chercher dans la valeur sérialisée du champs extra ... ça ne me plais guère ... mais je vais sans doute essayer.
Il serait possible d'obtenir bien mieux en sauvegardant dans une session les paramètres globaux de la page ... mais là, ça représente un certain volume de code :slight_smile:
J'y réfléchis, et/ou une ajaxisation (crayons ?) de la gestion.
Ça fera peut-être un mini-labo pour la gestion des visiteurs du core dont les résultats ne sont guère plus glorieux sur cette base...

Quoiqu'il en soit, sans qu'aucune fonctionnalité ne soit alterée, on passe maintenant en moins de 10 secondes sur ma pauvre machine de test.

A part cette refonte et quelques nettoyages/corrections,
j'ai mis en place ou réactivé/réparé:
* si tri par nom et interface privée avancée (le défaut), une barre d'initiales pour naviguer rapidement comme dans le core pour auteurs
* on cherche par email dès que la chaine cherchée contient @ et non plus seulement si c'est un email valid, par exemple, "@toggg" donne tous les abonnés dont l'email contient "toggg"
* c'était nécessaire pour la recherche, on peut maintenant utiliser le caractère % pour enclencher un LIKE et donc ne parcourir qu'un sous-ensemble des auteurs (sinon mots_ressemblants() explose)

Par exemple, pour chercher plus économiquement tous les auteurs avec "gg" dans le nom, entrer : "%gg%" exactement comme un LIKE sql.
Ca marche pareil pour les email, "%@toggg%" sera bien plus efficace, ne prendra par contre plus que ceux ayant "toggg" en début de host.

Je vous prie donc par la présente de bien vouloir vérifier si j'ai bien tout pété :slight_smile:

Par ailleurs, je vais devoir refaire le tableau de pagination, avec 130.000 sujets il fait plusieurs pages lourdes et quasi inutilisables.
Je pense éventuellement le transformet en un select autosubmit, ça sera moins lourd.
Aussi, dès que la population devient trop importante réduire l'affichage en ne mettant plus que des points comme
0 . . . . 150 . . . . 300
au lieu de
0 | 30 | 60 | 90 | 120 | 150 | 180 | 210 | 240 | 270 | 300 |
voire même:
A . . . B . C . . . . . D . . . . E . F G . H I L . . .
qui condenserait la barre d'initiale tout en donnant une meilleure lisibilité de la liste.

Merci pour tout commentaire ou autre idée/besoin que vous pourriez avoir.

J'attaque la partie envois par elle même, ça risque encore de grincher :slight_smile:
--
toggg

bertrand Gugger wrote:

Je suis à peu près au top, je ne vois que la requete pour rechercher les types d'abonnement qui pourrait être encore hackée, mais au prix d'un LIKE pour chercher dans la valeur sérialisée du champs extra ... ça ne me plais guère ... mais je vais sans doute essayer.

Voilà, j'ai fait ces regroupements en 10223 ... mais ça n'a guère l'ai efficace.
GROUP BY extra ne fait pas grand chose ... on dirait même qu'il vaudrait mieux chercher déjà les DISTINCT extra et sélectionner ensuite les comptes ... bizarre.

J'oubliais de dire que pour speeder les choses , j'ai rajouté 3 index en 80 char sur nom, email et extra

... à suivre
--
toggg

bertrand Gugger a écrit :

J'ai du donc refondre quasi complètement les requètes utilisées.

Excellent ! Bravo.

Essentiellement, on ne charge plus l'ensemble des auteurs mais uniquement la "tranche" demandée ou on utilise des requètes "groupées".
Je suis à peu près au top, je ne vois que la requete pour rechercher les types d'abonnement qui pourrait être encore hackée, mais au prix d'un LIKE pour chercher dans la valeur sérialisée du champs extra ... ça ne me plais guère ... mais je vais sans doute essayer.

En fait je crois qu'il faudrait en profiter pour se debarrasser des extras et mettre le format de reception dans la table des abonnements (auteurs_listes)
Je ne sais pas si au niveau perf ca serait optimal, mais ca serait pratique.

On aurait dans la table auteurs_listes :

id_auteur/id_liste/_format_abo/date_abo/date_desabo

avec pour valeur de format_abo quelquechose parmi (html, texte, suspendu, désabonné)

Ca permettrait de faire des stats plus précises sans faire le tour de tous les auteurs à chaque fois (abonnement, desabonnent, nombres d'abonnés, nombre d'abonnés a une liste).

Ca permettrai aussi d'aller taper dans une autre table d'abonnés qui aurait simplement un email par ex (une liste de spam independante des auteurs spip).

J'attaque la partie envois par elle même, ça risque encore de grincher :slight_smile:

Oui la aussi on a un goulet d'étranglement

Pour remplir la table des envois, on fait le tour de la table des abonnés à une liste, et pour chacun on paie notre requete pour l'inscrire dans la table des envois. Avec 10 000 abonnés ca commen ce déjà à ralentir, je pense que ca pete avec 130 000.

BoOz

BoOz wrote:

bertrand Gugger a écrit :

J'ai du donc refondre quasi complètement les requètes utilisées.

Excellent ! Bravo.

J'ai pas fini, une idée serait de rapprocher tout ça de #PAGINATION, avoir des mécanismes communs,
mais bon, c'est à plus long terme et sans doute plus général comme question, pour l'instant ça passerait comme ça quasi pour la gestion abonnés.

Essentiellement, on ne charge plus l'ensemble des auteurs mais uniquement la "tranche" demandée ou on utilise des requètes "groupées".
Je suis à peu près au top, je ne vois que la requete pour rechercher les types d'abonnement qui pourrait être encore hackée, mais au prix d'un LIKE pour chercher dans la valeur sérialisée du champs extra ... ça ne me plais guère ... mais je vais sans doute essayer.

En fait je crois qu'il faudrait en profiter pour se debarrasser des extras et mettre le format de reception dans la table des abonnements (auteurs_listes)
Je ne sais pas si au niveau perf ca serait optimal, mais ca serait pratique.

En voilà une idée qu'elle serait bonne, c'est clair que le extra sérializé c'est guère pratique pour des requètes de masse ...

Je pense qu'il n'y aurait pas trop de problème à faire l'upgrade/nettoyage de la base dans le script d'upgrade base.

On aurait dans la table auteurs_listes :

id_auteur/id_liste/_format_abo/date_abo/date_desabo

avec pour valeur de format_abo quelquechose parmi (html, texte, suspendu, désabonné)

Ca permettrait de faire des stats plus précises sans faire le tour de tous les auteurs à chaque fois (abonnement, desabonnent, nombres d'abonnés, nombre d'abonnés a une liste).

Ça fait plus le tour de tous, mais on ne peut éviter un passage par le php pour désérialiser, avec une solution comme ça, sql peut traiter direct.

Ca permettrai aussi d'aller taper dans une autre table d'abonnés qui aurait simplement un email par ex (une liste de spam independante des auteurs spip).

Ben oui, mais bon, sans droit de correction par l'abonné lui même, je sais pas si c'est jouable en indépendance du noyau... mais bon, c'est vrai que polluer les auteurs réels avec les visiteurs, c'est pas forcément top.

J'attaque la partie envois par elle même, ça risque encore de grincher :slight_smile:

Oui la aussi on a un goulet d'étranglement
Connexion · GitLab

Pour remplir la table des envois, on fait le tour de la table des abonnés à une liste, et pour chacun on paie notre requete pour l'inscrire dans la table des envois. Avec 10 000 abonnés ca commen ce déjà à ralentir, je pense que ca pete avec 130 000.

Disons qu'il y a le remplissage puis l'exploitation, on pourrait admettre que la 1ère phase dure 10 minutes, ça gène pas
... enfin, j'ai peut-être pas tout capté encore, là ...
--
toggg

Ca permettrai aussi d'aller taper dans une autre table d'abonnés qui
aurait simplement un email par ex (une liste de spam independante des
auteurs spip).

Ben oui, mais bon, sans droit de correction par l'abonné lui même, je
sais pas si c'est jouable en indépendance du noyau... mais bon, c'est
vrai que polluer les auteurs réels avec les visiteurs, c'est pas
forcément top.

Ce mélange entre auteurs et abonnés à une newsletter est un des principes de spip-listes qui nous embêtait et qui nous a fait créer le plugin CleverMail.

Si finalement spip-listes change de principe, nous pourrons peut-être envisager de rapprocher les deux plugins.

-Nicolas

--
Nicolas "Brush" HOIZEY
Clever Age : http://www.clever-age.com/
Gastero Prod : http://www.gasteroprod.com/
Photos : http://www.flickr.com/gp/38608514@N00/M1c002

BoOz a écrit :

Ca permettrai aussi d'aller taper dans une autre table d'abonnés qui
aurait simplement un email par ex (une liste de spam independante des
auteurs spip).

Toggg a écrit :

Ben oui, mais bon, sans droit de correction par l'abonné lui même, je
sais pas si c'est jouable en indépendance du noyau...

Sisi, il y aurait droit de correction, enfin de désabonnement, vu qu'on a dit que l'abonnement est dans la table auteurs_listes (qui porte mal son nom), donc l'abonné peut se désabonner, meme s'il n'est pas auteur dans spip.

Mais la modif dont je parle, c'est d'abord pour virer les extra, gagner en perfs et faire des stats plus précises ; en plus ca permet d'imaginer d'ouvrir plus tard la possibilité de taper sur une autre table que les auteurs, mais il faudra réfléchir un peu, ce n'est pas immédiat de supporter les deux méthodes (auteurs/pas auteurs), notamment en termes d'interface.

BoOz

mais il faudra réfléchir un peu, ce n'est pas immédiat de supporter les deux méthodes (auteurs/pas auteurs), notamment en termes d'interface.
  

tu me vois venir ?... :slight_smile:

Cedric wrote:

mais il faudra réfléchir un peu, ce n'est pas immédiat de supporter les deux méthodes (auteurs/pas auteurs), notamment en termes d'interface.
  

tu me vois venir ?... :slight_smile:

Non, tu peux préciser ?
--
toggg

Cedric a écrit :

mais il faudra réfléchir un peu, ce n'est pas immédiat de supporter les deux méthodes (auteurs/pas auteurs), notamment en termes d'interface.
  
tu me vois venir ?... :slight_smile:

Plus ou moins :stuck_out_tongue:

Mais je ne suis pas sur que tout transformer en forms et tables soit une solution "solide" et pérène. Je ne demande qu'à être convaincu cela dit.

BoOz

BoOz wrote:

Cedric a écrit :

mais il faudra réfléchir un peu, ce n'est pas immédiat de supporter les deux méthodes (auteurs/pas auteurs), notamment en termes d'interface.
  

tu me vois venir ?... :slight_smile:

Plus ou moins :stuck_out_tongue:

Mais je ne suis pas sur que tout transformer en forms et tables soit une solution "solide" et pérène. Je ne demande qu'à être convaincu cela dit.

BoOz

Bon si c'est pour introduire une 3ème méthode, j'en propose une quatrième, lol , #CONFIG{~duchmol/spip-listes}
...
--
toggg