[RESOLU] optimisation moteur de recherche

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] optimisation moteur de recherche

Re: [RESOLU] optimisation moteur de recherche

par juliette » 02 déc. 2012, 20:57

Tu l'as mis a la fin ? C'est ca la solution ? j'ai pas compris.
j'ai pas compris ce que tu veux savoir ???

Re: [RESOLU] optimisation moteur de recherche

par schim59 » 02 déc. 2012, 20:27

Tu l'as mis a la fin ? C'est ca la solution ? j'ai pas compris.

Re: optimisation moteur de recherche

par juliette » 02 déc. 2012, 14:28

Ok, c'est bien ça, merci Saian...
je stock tous mes js dont celui du moteur dans un fichier php et en début du moteur, je fait (include '../../includes/template/javascript.php';) donc forcement tous les js était charger lors de cette requête...
Des fois ça m’énerve de faire des bêtise comme ça :mrgreen: en plus ça fait 2 jours que je cherche en regardant le mauvais moteur :?

audaxman pour le coup je n'ai pas tester time() mais je vais regarder ça de plus prés pour l'avenir...

Re: optimisation moteur de recherche

par juliette » 02 déc. 2012, 14:01

ok, je sais pourquoi.. je teste et reviens vous expliquer si c'est ça...

Re: optimisation moteur de recherche

par Saian » 02 déc. 2012, 13:52

Yes, du classique rien qui visiblement plomberait le traitement.
Par contre quand je regarde la console firebug sur un appel de l'autocompletion y a plein de GET qui se font derrière de scripts bootstrap.
T'es obligé de les mettre dans le résultat de la requête ajax ? je pense que c'est de ce côté la qu'il faudrait optimiser (qu'il n'y ai bien qu'une seule requête serveur)

EDIT Si ta connexion rame et qu'en plus tu es en no cache (?) je pense que ça expliquerait bien pourquoi ça rame sur ton poste. Y a quand même 19 scripts qui sont chargés à partir du résultat de la requête ajax.

Re: optimisation moteur de recherche

par juliette » 02 déc. 2012, 13:45

le js:
[javascript]$(document).ready(function() {
// On écoute si l'utilisateur relache une touche
$('#moteur').keyup(function() {
// On déclare l'input dans une variable pour pouvoir l'appeler plus rapidement
$f = $(this);
// On vide la DIV des résultat pour s'assurer qu'elle soit bien vide au chargement de la page
$('#result').html('');
// On regarde si la valeur entré dans le champs est plus grand que un
if ($f.val().length > 2)
{
// On poste les renseignement à la page moteur.php en method POST
$.ajax({
type: 'POST',
url: 'modules/moteurs/moteur.php',
data: 'moteur=' + $f.val(),
// Si la requette est r�usite on renvoi à la div #result de se remplir du contenu retourner par la page moteur.php
success: function(data) {
$('#result').html(data);
}
});
}
});
});[/javascript]

Re: optimisation moteur de recherche

par juliette » 02 déc. 2012, 13:43

Attendez, je viens de faire faire un test a Saian et chez lui le résultat sort en 1 seconde
a savoir, je suis en bout de ligne et a priori, j'ai 1 mega 8 d’après france teleccom

Re: optimisation moteur de recherche

par Saian » 02 déc. 2012, 13:41

Je me disais la même chose que audaxman (le javascript). ;)

EDIT pour en dessous : c'est pour ça que l'idée du js qui rame parait cohérent, le problème semblant venir du côté client.

Re: optimisation moteur de recherche

par audaxman » 02 déc. 2012, 13:39

la fonction time() te donne le timestamp au moment du moment exact où tu appelle la fonction,
si tu met un echo time(); au début de ton script, puis un autres après avoir exécuté ta requête, puis un autre dans ta boucle, et un dernier à la fin de ton script ça te donnera les heures exactes à chaque étape du script et comme ça, en faisant la différence entres les timestamp tu sauras combien de temps a pris chaque étape, ce qui te permet ensuite de savoir quelle est la partie de ton script qui prend tant de temps.

en version améliorée tu peux aussi utiliser la fonction microtime() qui est plus précise.
// au début de ton scrip tu mets :
$t_initial = microtime();

// ...

// après ta requette tu mets
echo "le script tourne depuis ". ($microtime() - $t_initial) . "<br />" ;

// ...
// à l'intérieur de ta boucle idem
echo "le script tourne depuis ". ($microtime() - $t_initial) . "<br />" ;

// et à la fin de ton script idem
echo "le script tourne depuis ". ($microtime() - $t_initial) . "<br />" ;
à mon avis il est probable que tes 14 secondes d'exécution soient en fait dans la partie javascript de ton code et pas forcément dans la partie php

Re: optimisation moteur de recherche

par juliette » 02 déc. 2012, 13:34

Saian, ya pas des milliers de ligne mais ça viendras...

Re: optimisation moteur de recherche

par juliette » 02 déc. 2012, 13:32

ARF, super désolé j'ai plusieurs moteurs sur cette page et le moteur dont je parle est celui ci...
<?php
session_start();
include '../../includes/classes/connexion/Mysql.class.php';
include '../../includes/config.php';
include '../../includes/template/javascript.php';
?>
<table class="table well table-hover"> 
    <?php
    // si le formulaire est posté
    if (isset($_POST['moteur'])) {

        $q = strtolower(addslashes($_POST['moteur']));

        $bdd = new MySqlClass();
        $bdd->MysqlOpen($SqlHost, $SqlUser, $SqlPass, $SqlBdd);
        $req = $bdd->MysqlSelectPerso("SELECT 
                                        ce.id_chien       AS   id_chien,
                                        ce.nom            AS   nom,
                                        ce.id_affixe      AS   id_affixe_ce,
                                        ce.proprietaire   AS   proprietaire,
                                        ce.sex            AS   sex,
                                        ce.livre          AS   livre,
                                        ce.lof            AS   lof,
                                        ce.video          AS   video,
                                        ce.photo          AS   photo,

                                        af.id_affixe      AS   id_affixe,
                                        af.affixe         AS   affixe,
                                        af.prefixe        AS   prefixe,
                                        af.affixe_url     AS   aff_url

                                    FROM chien ce

                                    INNER JOIN affixe af  ON  ce.id_affixe = af.id_affixe

                                    WHERE LOWER( nom ) LIKE  '$q%' OR LOWER( lof ) LIKE  '$q%'");
        if ($req) {

            // Affichage
            for ($i = 0; $i < count($req); $i++) {
                $ligne = $req[$i];

                // suppression des ' du nom pour l'url
                $nom_url = $ligne['nom'];
                $Chaine = $nom_url;
                $Chaine = str_replace("'", "-", $Chaine);

                if (!empty($ligne['video'])) {
                    $vi = '<a href="#" rel="tooltip" data-placement="right" title="Ce pedigree contient une vidéo"><i class="icon-facetime-video"></i></a>';
                } elseif (!empty($ligne['photo'])) {
                    $vi = '<a href="#" rel="tooltip" data-placement="right" title="Ce pedigree contient une photo"><i class="icon-camera"></i></a>';
                } else {
                    $vi = '';
                }

                echo '
                      <tr>
                      <td width="50%">
                      <div class="tooltip-demo">
                          </i> <img src="assets/img/' . nl2br(stripslashes($ligne['sex'])) . '.png" title="Berger belge malinois' . nl2br(stripslashes($ligne['sex'])) . '"/>
                          <a href="' . $ligne['id_chien'] . '-pedigree-malinois-' . stripcslashes(strtolower($Chaine)) . '-' . $ligne['aff_url'] . '.html">    
                          <strong>' . stripcslashes($ligne['nom']) . '&nbsp;' . stripcslashes($ligne['prefixe']) . '&nbsp;' . stripcslashes($ligne['affixe']) . '</strong>
                          </a>
                          ' . $vi . '
                          <br />
                          ' . $ligne['proprietaire'] . ' 
                      </div>
                      </td>
                      ';

                if (isset($_SESSION['SESS_MEMBER_ID'])) {
                    if (isset($_SESSION['SESS_GROUPE']) and $_SESSION['SESS_GROUPE'] == 'Admin' or $_SESSION['SESS_GROUPE'] == 'Redacteur') {
                        echo'<td width="50%" class="hidden-phone">
                  <br /><p class="pull-right">Malinois ' . $ligne['livre'] . '&nbsp;' . $ligne['lof'] . '&nbsp;&nbsp;&nbsp;[<a href="#">Modifier</a>] | [<a href="#">Supprimer</a>]</p>
                  </td>
                  </tr>';
                    } elseif ($_SESSION['SESS_GROUPE'] == 'Membre') {
                        echo'<td width="50%" class="hidden-phone">
                  <br /><p class="pull-right">Malinois ' . $ligne['livre'] . '&nbsp;' . $ligne['lof'] . '</p>
                  </td>
                  </tr>';
                    }
                } else {
                    echo'<td width="50%" class="hidden-phone">
                  <br /><p class="pull-right">Malinois ' . $ligne['livre'] . '&nbsp;' . $ligne['lof'] . '</p>
                  </td>
                  </tr>';
                }
            }
        } else {
            echo '</table><p class="center"><strong><font color="red">Aucun r&eacute;sultat</font></strong></><br /><br />';
        }
    } else {
        header('location: 404.php');
        // var_dump($_GET['malinois']);
    }
    ?>
</table>
et ce n'est plus du tout le même, ce sont vos test qui m'on montrer que je me trompais de moteur....

Re: optimisation moteur de recherche

par Saian » 02 déc. 2012, 13:29

La colonne nom est bien indexée dans la base de données ? et tu as combien de lignes (beaucoup j'imagine pour que le traitement soit aussi long) ?

Re: optimisation moteur de recherche

par juliette » 02 déc. 2012, 13:23

je viens de faire 2 ou 3 tests et avec la requete comme ça
$sql = "SELECT id_chien, nom, status, affixe, aff_url, sex, proprietaire, livre, lof
                    FROM chien
                    WHERE
                    status = 'Valide'
                    AND
                     nom  LIKE  '$q%'
                    
                    ORDER BY nom";
le resultat est presque identique...

Re: optimisation moteur de recherche

par Saian » 02 déc. 2012, 13:21

Salut Steeve, y a beaucoup de lignes dans la table ?
A priori, ce qui pompe du temps, je pense aussi que c'est la requête. Tu pourrais transformer les colonnes du where en index, ça devrait faire gagner du temps si c'est pas fait.
Pareil, comme dit sirakawa, le lower n'est pas forcément indispensable dépendamment du type de la colonne. Sans certitude je crois que les varchar sont insensibles à la casse lors d'une comparaison contrairement au text (à moins que ce soit l'inverse, je ne sais plus) tu peux surement trouver l'info dans la doc MySQL.
Après sauf à faire un système de cache des résultats je vois pas trop comment tu pourrais réduire le temps de traitement. Mais un système de cache avec un champ de recherche libre à la saisi, ça peux vite devenir lourd en terme de stockage.

EDIT je pense bien à une autre méthode pour faire cette autocompletion. S'il n'y a pas des milliers de lignes dans la table, tu pourrais générer un tableau, avec par exemple en index l'id de la ligne et en valeur le nom du toutou, que tu pourrais stocker dans une variable javascript à l'aide de json_encode et la complétion irait chercher dans ce tableau au lieu de faire une requête. Le traitement se passerai en javascript par comparaison de chaîne en bouclant sur le tableau. Peut être que cela pourrait être plus rapide.

Re: optimisation moteur de recherche

par sirakawa » 02 déc. 2012, 10:12

Je ne sais pas si ça gagnerait grand chose, mais on doit pouvoir enlever lower() car dixit la doc confirmant mes tests:
"Les deux exemples suivants illustrent le fait que les comparaisons de chaînes de caractères ne sont pas sensibles à la casse à moins qu'une des opérandes soit une chaîne binaire(??? j'ai une vague idée du sens de ce gala de matelas). "