Un script PHP gourmand que j'aimerais mettre au régime


finstreet
WRInaute accro
WRInaute accro
 
Messages: 16999
Inscription: 10 Juil 2005

Un script PHP gourmand que j'aimerais mettre au régime

Message le Mar Fév 23, 2010 13:13

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 :

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
WRInaute accro
 
Messages: 8579
Inscription: 23 Nov 2005

Re: Un script PHP gourmand que j'aimerais mettre au régime

Message le Mar Fév 23, 2010 13:21

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
WRInaute accro
 
Messages: 16999
Inscription: 10 Juil 2005

Re: Un script PHP gourmand que j'aimerais mettre au régime

Message le Mar Fév 23, 2010 13:32

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.


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8579
Inscription: 23 Nov 2005

Re: Un script PHP gourmand que j'aimerais mettre au régime

Message le Mar Fév 23, 2010 13:35

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.


Nic'O
WRInaute discret
WRInaute discret
 
Messages: 181
Inscription: 13 Mai 2009

Re: Un script PHP gourmand que j'aimerais mettre au régime

Message le Mar Fév 23, 2010 13:37

Tu peux très mettre un système de cache html, que tu reset si une modification ou ajout d'un mot dans ta table.


finstreet
WRInaute accro
WRInaute accro
 
Messages: 16999
Inscription: 10 Juil 2005

Re: Un script PHP gourmand que j'aimerais mettre au régime

Message le Mar Fév 23, 2010 13:39

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 :)


Nic'O
WRInaute discret
WRInaute discret
 
Messages: 181
Inscription: 13 Mai 2009

Re: Un script PHP gourmand que j'aimerais mettre au régime

Message le Mar Fév 23, 2010 13:56

Tu as regardé comment faisait certains plugins WP ? j'apprends souvent comme ça pour l'optimisation.


finstreet
WRInaute accro
WRInaute accro
 
Messages: 16999
Inscription: 10 Juil 2005

Re: Un script PHP gourmand que j'aimerais mettre au régime

Message le Mar Fév 23, 2010 13:57

Nic'O a écrit:Tu as regardé comment faisait certains plugins WP ? j'apprends souvent comme ça pour l'optimisation.


J'ai déjà du mal à comprendre les miens :)


Julia41
WRInaute passionné
WRInaute passionné
 
Messages: 1765
Inscription: 31 Aoû 2007

Re: Un script PHP gourmand que j'aimerais mettre au régime

Message le Mar Fév 23, 2010 13:58

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 ?


Nic'O
WRInaute discret
WRInaute discret
 
Messages: 181
Inscription: 13 Mai 2009

Re: Un script PHP gourmand que j'aimerais mettre au régime

Message le Mar Fév 23, 2010 14:03

J'aurai même tendance à dire, colle ton code ca permettra surement de voir d'un coup d'oeil les trucs qui clochent.


finstreet
WRInaute accro
WRInaute accro
 
Messages: 16999
Inscription: 10 Juil 2005

Re: Un script PHP gourmand que j'aimerais mettre au régime

Message le Mar Fév 23, 2010 15:12

Alors le code il ressemble à :

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é
WRInaute impliqué
 
Messages: 968
Inscription: 14 Jan 2008

Re: Un script PHP gourmand que j'aimerais mettre au régime

Message le Mar Fév 23, 2010 15:21

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 ?


Julia41
WRInaute passionné
WRInaute passionné
 
Messages: 1765
Inscription: 31 Aoû 2007

Re: Un script PHP gourmand que j'aimerais mettre au régime

Message le Mar Fév 23, 2010 15:30

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 :
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é
WRInaute passionné
 
Messages: 1765
Inscription: 31 Aoû 2007

Re: Un script PHP gourmand que j'aimerais mettre au régime

Message le Mar Fév 23, 2010 15:33

Et ça donne quoi en SQL un :
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
WRInaute accro
 
Messages: 16999
Inscription: 10 Juil 2005

Re: Un script PHP gourmand que j'aimerais mettre au régime

Message le Mar Fév 23, 2010 16:38

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

Un script PHP gourmand que j'aimerais mettre au régime

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités