Une moulinette un peu trop... grosse :-)

WRInaute accro
Hello,

Bon alors je viens de faire un truc... c un vieux truc que j'avais déjà fait mais je ne me souvenais plus pourquoi je l'avais supprimé... maintenant je me souviens :)

Bon alors prenons un texte d'un nombre de caractères variables et provenant d'une base de données. Supposons que l'on veuille introduire dans ce texte, de façon automatique et systématique, la définition de certains termes. Ces termes proviennent aussi de la base de données.

Alors c'est assez simple. Je récupère le contenu initial du texte qui devient une variable. Ensuite je récupère le nom de tous les termes qui existent dans le lexique avec un while et dans la boucle je fais un simple preg_replace

Le soucis c'est que le contenu du texte peut monter à plusieurs dizaines de lignes, voire 100 ou 200... et que l'ensemble des termes représentent 3.000 mots.

Bref, ca m'explose ma charge serveur

Alors y'a t-il une solution pour faire pareil mais sans tout exploser et sans modifier le contenu dans la table ?

Marchi :)

ps : je peux montrer le code mais ca changera pas grand chose... partez du principe qu'il est nul :)
 
WRInaute accro
nickargall a dit:
Bonjour
Un systeme de cache pour pas que ton serveur explose à chaque visite ?

y'a déjà le système de cache de mysql d'activé... mais meme si je fais un cache plus... costaud ca risque de diminuer un peu mais vu que bcp de textes sont différents... ca planterait aussi pas mal... enfin à mon avis
 
WRInaute accro
Arghhhhh je viens de voir que la taile du cache est 0 ... arghhhhhhh

Dites... faut mettre quoi comme taille de cache pour mysql ?
 
WRInaute passionné
Et pourquoi que du cache MySQL?

Si ton texte et tes définitions reste relativement stable tu peux mettre un cache HTML plutôt. Ca génère ton texte selon le temps choisis, 24H par exemple.
 
WRInaute accro
Salut, et pourquoi n'enregistres-tu pas le texte avec les définitions directement dans la base après la routine, c-a-d après l'avoir traité, tu enregistres également la date d'enregistrement de sorte qu'à l'affichage tu ne lances la routines que tous les x jours (et donc avec éventuellement de nouvelles définitions ?
@+
 
WRInaute accro
serval2a a dit:
Salut, et pourquoi n'enregistres-tu pas le texte avec les définitions directement dans la base après la routine, c-a-d après l'avoir traité, tu enregistres également la date d'enregistrement de sorte qu'à l'affichage tu ne lances la routines que tous les x jours (et donc avec éventuellement de nouvelles définitions ?
@+

parce que je ne veux pas toujours du tout à la table de contenu... une sorte de principe on va dire

k2pi a dit:
Si effectivement tes textes sont plutot stable (ce qui est normalement le cas sur 24h au moins je pense) ta solution est probablement de mettre en place un systeme de cache

lis ca tu devrais trouver ton bonheur : http://www.journaldunet.com/developpeur ... he1c.shtml

J'ai trouvé ca qui explique pas mal aussi
http://www.siteduzero.com/tutoriel-3-31 ... e-php.html
 
WRInaute impliqué
finstreet a dit:
nickargall a dit:
Bonjour
Un systeme de cache pour pas que ton serveur explose à chaque visite ?

y'a déjà le système de cache de mysql d'activé... mais meme si je fais un cache plus... costaud ca risque de diminuer un peu mais vu que bcp de textes sont différents... ca planterait aussi pas mal... enfin à mon avis

Bonjour,
C'est sûr, tu dois avoir une panoplie de solution, Je te propose une solution intermédiaire qui est un bon compromis en terme d'heures de boulot et performance,
tu "prémaches" le boulot, en "indexant" les mots existant dans ton texte.

Techniquement, Tu rajoutes un champ supplémentaire dans ta table que l'on va appeler "motcles", avec une routine tu prélèves tous les mot-clés de tes textes et tu fais un UPDATE dans le champ "motcles" associés. Son contenu peut etre de la forme "motcle1:motcle2:motcle3..."
. C'est la 1ère étape qui correspond à l'indexation

Ensuite lorsque tu fais une requete pour obtenir ton texte, mais à la place de faire un preg-replace avec les 3000 mots, tu fais un preg_replace défini par le champ "motcles",
tu explodes la variable "motcles" par rapport au séparateur ":" et tu fais ta boucle avec un foreach.
 
WRInaute accro
FinStreet, pourquoi ne pas mettre un cache HTML ?

J'utilise CacheLite, très léger, simple à mettre en place et fichtrement efficace :wink:
 
WRInaute accro
oulala que de propositions :)

Bon alors vu la structure actuelle de mon code... toutes les solutions vont demander un peu de temps mais vais surement développer un système de cache

sinon mon hébergeur vient de me répondre et il a modifié mon cache mysql ... 256 Mo désormais et il a modifié pas mal de trucs pour optimiser Mysql. J'ai pas retenté ma moulinette, mais je tenterais pas avant d'avoir mis en cache :)

Merci en tout cas
 
WRInaute passionné
si ce n'est pas trop tard j'ai une solution que j'ai utilisé pour un problème similaire.

dans mon cas j'ai fais tourner un cron job qui met à jours les derniers textes modifiés et les met en cache.

si un utilisateur tente de charger un texte pas encore en cache on tente de faire tourner la moulinette en surveillant la charge CPU.

je me suis servi d'une fonction très utile sur PHP qui donne la moyenne de charge CPU sur une durée donnée (1minute, 5minutes, 15minutes ...etc)




Code:
$maxload = 20; //20% de charge max

...
$load = sys_getloadavg();
$load = array_slice($load, 0, 1);
$load = floatval($load[0]);
if ($load >= $maxload)
{
 // CPU surchargé on arrete 
return;  //éventuellement break si c'est une boucle ou exit() si c'est une page
}
....

en général les hébergeurs communiquent le taux de CPU max qu'un processus a le droit d'occuper. et pour qu'un processus soit pénalisé il doit occupé ce seul pendant une certaine durée.

en utilisant sys_getloadavg tu as la moyenne de charge CPU sur une minute et donc tu peux t'arranger pour lancer ton processe au meilleur moment.

certes dans le cas d'un hebergeur mutualiser cette methode te renvoi la charge moyenne globale, mais si tu lance ta moulinette au moment ou le CPU est à 2% et qu'une minute après il se retrouve à 30% y a de fortes chances que ca soit ta boucle qui le surcharge ... tu fais donc une pause le temps que ca sa calme
 
WRInaute accro
suis en pleine étude des systèmes de caches donc ca va prendre un peu de temps pour mettre une solution en place... mais j'y travaille :-)

La solution d'Aladdin me fait penser à une méthode... encore plus bourrine qu'avant

Je n'ai qu'une table sur laquelle ce système de mots sera mis en place... la table est grosse j'en conviens, et je pars du postulat que je ne veux pas modifier le contenu initial pour des raisons qui me sont propres (genre je modifie les urls en autre chose)....

Bref, pourquoi ne pas faire un cache au sein même de la table... cela correspondrait à créer deux nouvelles colonnes : une colonne date et une colonne Contenu modifié... quand le contenu est cherché dans la table, le système va chercher si il existe un contenu en cache (avec possible vérification de la mise à jour du cache, notamment si modif des liens) dans la colonne Contenu modifié... si il y a un contenu modifié, alors c'est celui là qui sera affiché en brut de fonderie... sinon affichage de la page et recherche des termes dans la table lexique ET update de la table pour mettre ce nouveau contenu dans contenu modifié

Je sais que c'est tiré par les cheveux, que ca va alourdir une table déjà conséquente mais ca a le mérite de mettre rapidement son système en place

Qu'en pensez-vous ? ... même si c'est clair que c pas la meilleure solution, en tout cas pas la plus propre
 
WRInaute passionné
J'utilise une méthode similaire sur un (vieux) forum : les "bbcode", smileys, url, et autres formatages sont enregistrés dans la même table, de manière compressé (pour limiter l'impact).
En cas de modification de l'algo, des tags, ou autres, je fais juste un "update" de cette table pour effacer cette version préformatée... Elle sera simplement recalculée "à la volée" au fur et à mesure des affichages.

Mais cela ne m'empêche pas d'avoir un cache de données, complètement indépendant.
 
WRInaute accro
bon alors au vu de mes compétences à court terme et du délai que j'avais, je viens de mettre en place la solution de nouveaux champs dans la table... ca tourne très bien et ca me permet d'afficher ce que je désirais

Mais pour le reste, je mettrais effectivement en place une solution complète de cache si possible pour une grande partie du site, car c'est vrai que l'intéret est limité d'aller chercher des trucs dans des pages qui bougent pas... ou si peu

Je vous tiendrais au courant de la suite des évènements

En tout cas une fois que monsieur Google aura scanné toutes les pages que j'ai modifié (dans les 50.000), il va me balancer dans les 150-200.000 nouveaux liens internes. J'ai limité à un lien identique par page.

La grande question est : Google va t-il apprécier de recevoir dans sa tronche 200.000 liens internes redirigeant vers 3.000 pages du site. Je précise qu'à la base le système est pas fait pour ca, car j'ai très clairement souligné les liens. C'est un système destiné à faire de la PAP en donnant une nouvelle information au visiteur.

Enfin bon tout ca on verra dans les jours à venir :)

ps : Google a déjà mangé 150 pages en quelques minutes... miam :)
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut