Un script PHP gourmand que j'aimerais mettre au régime
34 messages
• Page 1 sur 3 • 1, 2, 3
-

finstreet - WRInaute accro

- Messages: 16999
- Inscription: 10 Juil 2005
Un script PHP gourmand que j'aimerais mettre au régime
Hello
Toujours dans la quête de l'amélioration de la vitesse de chargement et de la baisse de la charge serveur, j'ai un petit script PHP qui me pose problème. Le rôle de ce script est de générer des liens automatiques internes.
J'explique.
J'ai un texte que nous appellerons "Le Texte" (le terme de "Petit Parapluie" peut aussi être utilisé ou encore "Menthe Rouge"). Le Texte peut être court, ou long, ou pas très long, ou moyen, ou "oulala c'est trop long" ou encore "c'est déjà fini" ou "oh il a vraiment la taille idéale Le Texte". Bref, la taille change d'un Le Texte à l'autre. Et comme je dis toujours, c'est surtout l'intérêt du Le Texte qui compte et pas sa taille. Parce qu'il peut y avoir d'excellents Le Texte avec très peu de caractères.
De l'autre côté, j'ai un lexique que nous appellerons "Le Lexique". Le lexique comprend plus de 4.500 termes de plus de 4 caractères (en dessous c'est trop le bronx pour générer des liens).
Je lance une requete sur "Le Lexique" afin de récupérer la totalité des termes de plus de 4 caractères.
Ensuite dans une boucle, je fais un joli ereg_replace pour mettre en place les liens vers "Le Lexique" dans "Le Texte"... et là... ca rame
Alors le but est soit de revoir le script de fond en comble, soit de l'améliorer par quelques petites astuces. Y'a déjà une mise en cache. Ainsi cette moulinette ne tourne qu'une seule fois, pour le premier internaute qui voit Le Texte, souvent Google
Je viens de penser à une chose. La table contenant le lexique n'est indexée qu'au niveau de la clé. Y'aurait il à intégrer un index dans le champ Terme aussi ? Après vérif, c'est les ereg replace qui prennent du temps alors voilà à quoi ils ressemblent :
Alors si vous avez une tite piste
A bientôt
Toujours dans la quête de l'amélioration de la vitesse de chargement et de la baisse de la charge serveur, j'ai un petit script PHP qui me pose problème. Le rôle de ce script est de générer des liens automatiques internes.
J'explique.
J'ai un texte que nous appellerons "Le Texte" (le terme de "Petit Parapluie" peut aussi être utilisé ou encore "Menthe Rouge"). Le Texte peut être court, ou long, ou pas très long, ou moyen, ou "oulala c'est trop long" ou encore "c'est déjà fini" ou "oh il a vraiment la taille idéale Le Texte". Bref, la taille change d'un Le Texte à l'autre. Et comme je dis toujours, c'est surtout l'intérêt du Le Texte qui compte et pas sa taille. Parce qu'il peut y avoir d'excellents Le Texte avec très peu de caractères.
De l'autre côté, j'ai un lexique que nous appellerons "Le Lexique". Le lexique comprend plus de 4.500 termes de plus de 4 caractères (en dessous c'est trop le bronx pour générer des liens).
Je lance une requete sur "Le Lexique" afin de récupérer la totalité des termes de plus de 4 caractères.
Ensuite dans une boucle, je fais un joli ereg_replace pour mettre en place les liens vers "Le Lexique" dans "Le Texte"... et là... ca rame
Alors le but est soit de revoir le script de fond en comble, soit de l'améliorer par quelques petites astuces. Y'a déjà une mise en cache. Ainsi cette moulinette ne tourne qu'une seule fois, pour le premier internaute qui voit Le Texte, souvent Google
Je viens de penser à une chose. La table contenant le lexique n'est indexée qu'au niveau de la clé. Y'aurait il à intégrer un index dans le champ Terme aussi ? Après vérif, c'est les ereg replace qui prennent du temps alors voilà à quoi ils ressemblent :
- Code: Tout sélectionner
$contenu = preg_replace('#(\s|\'|>|\t)('.$leTermeGloss.')(\s|\.|s|,)#i', "$1<a href='$urlGloss.php'>$2</a>$3", $contenu, 1);
Alors si vous avez une tite piste
A bientôt
-

UsagiYojimbo - WRInaute accro

- Messages: 8579
- Inscription: 23 Nov 2005
Re: Un script PHP gourmand que j'aimerais mettre au régime
Perso j'ai un truc équivalent que je gère en CRON, et qui tourne de manière automatique la nuit. Ce CRON compare le contenu et les mots de l'index et remplis une table d'association. Ensuite sur le site, à l'appel d'un contenu je ne récupère (dans ma table d'association donc) que les mots qui y sont associés et le preg_replace fait le reste.
-

finstreet - WRInaute accro

- Messages: 16999
- Inscription: 10 Juil 2005
Re: Un script PHP gourmand que j'aimerais mettre au régime
tu entends quoi par une table d'association ? Un truc du genre : ce mot a été trouvé dans ce texte et hop une ligne ?
Mais là on perd un peu l'intéret car les actus sont vite obsolètes, et faire tourner ca la nuit ferait sauter tout l'intérêt pour le plus gros des visiteurs.
Mais là on perd un peu l'intéret car les actus sont vite obsolètes, et faire tourner ca la nuit ferait sauter tout l'intérêt pour le plus gros des visiteurs.
-

UsagiYojimbo - WRInaute accro

- Messages: 8579
- Inscription: 23 Nov 2005
Re: Un script PHP gourmand que j'aimerais mettre au régime
C'est exactement ça.
Par contre étant donné qu'une fois créé les contenus sont peu mis à jour (il ne s'agit pas d'actualité pour ma part), et que la base des index évolue peut ca ne pose pas de souci.
Par contre étant donné qu'une fois créé les contenus sont peu mis à jour (il ne s'agit pas d'actualité pour ma part), et que la base des index évolue peut ca ne pose pas de souci.
-

finstreet - WRInaute accro

- Messages: 16999
- Inscription: 10 Juil 2005
Re: Un script PHP gourmand que j'aimerais mettre au régime
non mais le cache, le reset, tout ca je fais... c'est le .. avant qui me pose problème. La première fois que les liens sont générés. La ca prend dix secondes. Sinon ca prend un dixième de seconde 
-

Julia41 - WRInaute passionné

- Messages: 1765
- Inscription: 31 Aoû 2007
Re: Un script PHP gourmand que j'aimerais mettre au régime
J'ignore un peu la méthode utilisée sur ce plugin wordpress (celui utilisé par WRI) qui remplace certains termes par des acronymes du terme. Ca m'a l'air d'être un peu le même principe (il va chercher dans une DB les définitions).
Tu pourrais regarder, car il m'a l'air pas mal utilisé et je pense que ça devrait pouvoir se faire simplement avec d'autres méthodes.
Sinon (mais je ne suis pas sûr de mon raisonnement). Charger le contenu des mots du lexique dans un array, et utilisation de in_array de PHP, alors on remplace.
Preg_replace est très gourmand, mais d'un autre côté, un select sur 4000 mots devrait l'être aussi.
Autre solution à tester : faire 1 select par mot en "explodant" tes "espaces" et vérifier si le mot (strlen) fait plus de 4 caractères.
Petite question, comment fais-tu ta boucle ? Avec un while, un foreach, un for ?
Tu pourrais regarder, car il m'a l'air pas mal utilisé et je pense que ça devrait pouvoir se faire simplement avec d'autres méthodes.
Sinon (mais je ne suis pas sûr de mon raisonnement). Charger le contenu des mots du lexique dans un array, et utilisation de in_array de PHP, alors on remplace.
Preg_replace est très gourmand, mais d'un autre côté, un select sur 4000 mots devrait l'être aussi.
Autre solution à tester : faire 1 select par mot en "explodant" tes "espaces" et vérifier si le mot (strlen) fait plus de 4 caractères.
Petite question, comment fais-tu ta boucle ? Avec un while, un foreach, un for ?
-

finstreet - WRInaute accro

- Messages: 16999
- Inscription: 10 Juil 2005
Re: Un script PHP gourmand que j'aimerais mettre au régime
Alors le code il ressemble à :
Table du lexique :
ID int(11)
Terme varchar(255)
Url varchar(250)
Le code :
Voili
Table du lexique :
ID int(11)
Terme varchar(255)
Url varchar(250)
Le code :
- Code: Tout sélectionner
$contenu = "Hello ! Comment vous allez bien ?";
$query = "SELECT ID, Terme, Url FROM lexique WHERE LENGTH(Terme) > 4 ";
$mysql_result = mysql_query($query, $mysql_link) or die("Erreur SQL : $query<br/>".mysql_error());
while ($row = mysql_fetch_array($mysql_result))
{
$idlex = $row['ID'];
$leTerme = $row['Terme'];
$url = $row['Url'];
$contenu = preg_replace('#(\s|\'|>|\t)('.$leTerme.')(\s|\.|s|,)#i', "$1<a href='$urlGloss.php'>$2</a>$3", $contenu, 1);
}
Voili
-

screuscreu - WRInaute impliqué

- Messages: 968
- Inscription: 14 Jan 2008
Re: Un script PHP gourmand que j'aimerais mettre au régime
idée à la con :
ton texte $monTexteContenu = "mon texte super bien coucou", tu le transforme en
$monContenuSplitéEnMots = "mon", "texte", "super", "bien", "coucou";
Avec ces mots tu fais un select (plus petit donc) du genre :
select id, terme, url from lexique where terme in($monContenuSplitéEnMots) and length(terme)>4
Ce qui fait que tu réduis énormément ton nombre de termes et donc ta boucle
Bonne idée ... ou je retourne dans MON code ?
ton texte $monTexteContenu = "mon texte super bien coucou", tu le transforme en
$monContenuSplitéEnMots = "mon", "texte", "super", "bien", "coucou";
Avec ces mots tu fais un select (plus petit donc) du genre :
select id, terme, url from lexique where terme in($monContenuSplitéEnMots) and length(terme)>4
Ce qui fait que tu réduis énormément ton nombre de termes et donc ta boucle
Bonne idée ... ou je retourne dans MON code ?
-

Julia41 - WRInaute passionné

- Messages: 1765
- Inscription: 31 Aoû 2007
Re: Un script PHP gourmand que j'aimerais mettre au régime
Je crois que preg_replace n'aime pas la concaténation mais niveau benchmark c'est de l'ordre de *10 en vitesse de traitement :
A vérifier si ça passe, je n'utilise que trop peu cette fonction.
Edit: en effet ça ne passe pas. Peut-être tenter avec des délimiteurs de type {}
- Code: Tout sélectionner
$contenu = preg_replace('#(\s|\'|>|\t)('.$leTerme.')(\s|\.|s|,)#i', $1 . "<a href=\"" . $urlGloss.php . "\">" . $2 . "</a>" . $3, $contenu, 1);
A vérifier si ça passe, je n'utilise que trop peu cette fonction.
Edit: en effet ça ne passe pas. Peut-être tenter avec des délimiteurs de type {}
-

Julia41 - WRInaute passionné

- Messages: 1765
- Inscription: 31 Aoû 2007
Re: Un script PHP gourmand que j'aimerais mettre au régime
Et ça donne quoi en SQL un :
en vitesse d'execution ?
Et un :
retourne bien des bons index ?
- Code: Tout sélectionner
SELECT ID, Terme, Url FROM lexique WHERE LENGTH(Terme) > 4;
en vitesse d'execution ?
Et un :
- Code: Tout sélectionner
EXPLAIN SELECT ID, Terme, Url FROM lexique WHERE LENGTH(Terme) > 4;
retourne bien des bons index ?
-

finstreet - WRInaute accro

- Messages: 16999
- Inscription: 10 Juil 2005
Re: Un script PHP gourmand que j'aimerais mettre au régime
Pour screucreu ... ah j'y avais pas pensé. J'essaye d'appliquer et je reviens
Pour le SELECT, ca donne 0.0013 sec en vitesse d'exécution
Et le EXPLAIN donne :
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE lexique ALL NULL NULL NULL NULL 5139 Using where
Pour le SELECT, ca donne 0.0013 sec en vitesse d'exécution
Et le EXPLAIN donne :
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE lexique ALL NULL NULL NULL NULL 5139 Using where
34 messages
• Page 1 sur 3 • 1, 2, 3
Lectures recommandées sur ce thème :
- Identifier un script trop gourmand
- Script PHP pour mettre un petit dictionnaire en ligne???
- Script php pour mettre ses Parrainages au hasard
- Autoentrepreneur et Salarié, Comment passer du régime RSI au régime général?
- Nouveau site diet-regime.com minceur regime et dietetique
- Comment lancer un script php à parrtir d'un autre script php ?
- j aimerais afficher ipod
- ou mettre le script??
- Mon site v2 en ligne aimerais faire pareil pour le referencement
- [Script] - Interroger et manipuler Wordpress directement via un script PHP en crontab
- Ajouter un Gadget Google sur son site - 04-10-2006
- Google Chrome dépasse Safari aux USA - 29-06-2010
- Les albums web Picasa passent à 1 Go de stockage - 08-03-2007
- AdSense Tracking : statistiques détaillées sur les clics AdSense - 29-02-2004
- Google Pack s'enrichit de 2 nouveaux logiciels gratuits - 28-03-2007
- Photos satellite des incendies en Grèce dans Google Earth - 30-08-2007
- Google Desktop pour Mac OS X - 05-04-2007
- Moteur de recherche dans les blogs de Google - 24-01-2007
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités


