IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Autocomplete/AJAX et performances [2.x]


Sujet :

Symfony PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur d'affaires
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'affaires
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Autocomplete/AJAX et performances
    Bonjour,

    J'ai réussi à faire fonctionner la fonction Autocomplete de Jquery UI via AJAX interrogeant ma base de données, mais avec un temps de réponse catastrophique (3 secondes sous Symfony2 versus 20ms avec PHP sans Symfony2).
    Ai-je fais des erreurs dans mon raisonnement ?
    Voici ma logique : une route insérée dans la partie URL d'AJAX via la contrôleur accède au repository adéquate et retourne un objet Réponse (en JSON).

    De plus, voici ce que j'ai développé :
    1) Le script dans la vue Twig :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <script>   
        $('#men_commandesbundle_commandetype_nature').autocomplete({
    		source : function(requete, reponse){
    			var motcle = $('#men_commandesbundle_commandetype_nature').val();
    			var DATA = 'motcle=' + motcle;
    			$.ajax({
    				type:"POST",
    				url : "{{ path('mencommandes_ajaxnature') }}",
    				dataType : 'json',
    				data : DATA, 
     
    				success : function(donnee){
    					reponse($.map(donnee, function(objet){
    	                    return objet; 
    	                }));
    	            }
    			});
    		}
    	});
        </script>
    b) La route :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    mencommandes_ajaxnature:
        pattern: /ajaxnature
        defaults: { _controller: menCommandesBundle:Commandes:ajaxnature}
        requirements:
            _method: POST
    c) L'action AjaxNature dans le contrôleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public function ajaxnatureAction()
    	{
    		$request = $this -> get('request');
     
    		if($request->isXmlHttpRequest())
    		{
    			$term = $request->request->get('motcle');
     
    			$array= $this->getDoctrine()
    				->getEntityManager()
    				->getRepository('menCommandesBundle:commande')
    				->listeNature($term);
     
    			$response = new Response(json_encode($array));
     
    			$response -> headers -> set('Content-Type', 'application/json');
    			return $response;
    		}
    	}
    d) La fonction ListeNature dans le repository :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public function listeNature ($term)
    	{
    		$qb = $this->createQueryBuilder('c');
     
    		$qb ->select('c.nature')
    			->where('c.nature LIKE :term')
    			->setParameter('term', '%'.$term.'%');
     
    		$arrayAss= $qb->getQuery()
                       ->getArrayResult();
     
    		// Transformer le tableau associatif en un tableau standard
    		$array = array();
    		foreach($arrayAss as $data)
    		{
    			$array[] = $data['nature'];
    		}
     
    		return $array;
    Si quelqu'un a une idée pour le temps de réponse catastrophique, merci par avance.
    Je précise que depuis, j'ai externalisé dans un fichier Javascript la partie correspondante dans la vue Twig, mais sans aucun changement sur les performances.

    Spiffou92.

  2. #2
    Membre averti

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Points : 364
    Points
    364
    Par défaut
    Moi je suis à 500 ms pour un autocomplete similaire avec une dizaine de résultats sous windows. A noter que sous windows, symfony en mode dev est très très lent (pour un certain nombre de raison). Sur mon ancienne machine (core2 duo) j'étais régulièrement à plus de 2 seconde pour générer des pages.

    T'as combien de résultats ? t'as essayé de voir ce que ca donnait sur un serveur linux ?

    Olivier

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur d'affaires
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'affaires
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour Olivier,

    Merci pour ton retour !

    Débutant sur Symfony2 et PHP, je suis rassuré que mon code ne pose pas problème.

    La problématique est donc d'après ton retour du fait que je suis toujours en DEV.
    Je travaille actuellement en local sur mon portable Windows XP Core i3.
    Je n'ai pas essayé sur Linux, mais je verrai donc la différence après passage en PROD.

    En fait, ce qui m'étonne le plus est que les résultats mesurés sur Firebug soient aléatoires.
    Sur une vingtaine de tests, mes résultats vont de 882ms à 16,86s (cf copie d'écran intitulé "Symfony2") et que dans certains cas j'ai une erreur.

    Hors Symfony2, sur un autre projet PHP, mes résultats sont toujours identiques et de l'ordre de 80ms (copie d'écran "PHP"). Je comprends mal cette différence.

    Merci pour tes lumières.
    Spiffou92
    Images attachées Images attachées   

  4. #4
    Membre averti

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Points : 364
    Points
    364
    Par défaut
    eu je n'ai pas regardé ton code. J'ai juste comparé évec celui que j'avais fait la semaine dernière.

    Sinon question, malgré ces tps de réponse, il marche ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur d'affaires
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'affaires
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    @Olivier alias Bilbot

    Oui, mon code fonctionne.
    Je testerai donc en PROD dans quelques temps (je ne sais pas encore faire) pour comparer les temps de réponses.

    Étant jeune développeur, je suppose, peut être à tort, que les mauvais temps de réponses aléatoires sont dûs à un mauvais développement.
    A défaut du code, peux-tu me confirmer mon raisonnement ? Et plus précisément le cheminement logique (ou flux) ci-dessous de le requête AJAX dans mon projet Symfony2 (architecture MVC) :
    JS lié à la vue TWIG --> Action (dans contrôleur via la route) --> Repository --> Action (dans contrôleur) --> JS

    Ton retour me confirme déjà qu'il peut exister des problèmes de performances en DEV (par définition).

    Merci de ton aide.
    Spiffou92

  6. #6
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Bonjour,

    A mon avis, ne t'inquiete pas trop.

    La seule chose que tu peux mesurer en temps en mode dev, ce sont les requetes SQL. Si tu en fait 2000 au lieu d'une par exemple, c'est pertinent de regarder.

    Autrement, le mode dev est la pour vérifier le fonctionnement, mais en production, tu aura : du code généré, du cache, pas d'outils de dev, etc... bref un site bien plus véloce.

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 81
    Points : 56
    Points
    56
    Par défaut
    Je pense aussi que tu ne devrais pas te faire de soucis. Tu n'as pas fait du tout de truc tordu au niveau du code, mais pense quand même à mettre un système de cache qui mettra la construction de ta requête en cache.

    Si tu sais pas trop comment faire ça, tu peux aussi récupérer directement la connection dans ton contrôleur avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $conn = $this->get('database_connection');
    et ensuite récupérer le résultat d'une requête de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tontableau = $conn->fetchAll("SELECT a.truc, a.machin FROM `table` a WHERE a.name LIKE \"%".$variable."%\" LIMIT 12");
    Ce qui te permet de "bypasser" entièrement la construction de la requête et peut être gagner un peu en performance, mais le mieux c'est que tu testes tout ça sur un "vrai" serveur, parce que Symfony2 sous windaube, il s’étouffe super rapidement, bref, c'est pas fait pour ! Je te conseil de te faire une petite partition linux sur ton PC en plus de Windows, pour le développement en local c'est le bonheur tu verras !

    Autre chose, pour utiliser des routes Symfony2 en JS il faut que tu utilises le Bundle FOSJsRoutingBundle que tu trouvera ici

    J'espère t'avoir aidé un peu !

    Bonne chance !

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Ingénieur d'affaires
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'affaires
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    merci à pmithrandir et vgross pour vos retours !
    Je suivrai vos conseils.

    @ vgross : je vais télécharger le Bundle FOSJsRoutingBundle pour voir ce que cela donne et aussi mettre un système de cache pour optimiser, maintenant que je suis rassuré sur mon code.

    @+
    Spiffou92

    PS : je passe le post sous le statut "résolu".

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. AutoComplete ajax asp.net
    Par lazins dans le forum ASP.NET
    Réponses: 6
    Dernier message: 06/03/2009, 20h35
  2. composant autocomplete ajax asp.net 1.1
    Par ouadie99 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 03/12/2008, 18h59
  3. [MooTools] Multiples requêtes Ajax et performances
    Par ALkyD dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 15/01/2008, 11h11
  4. [AJAX] Autocomplete ajax
    Par jenyfer dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/12/2006, 22h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo