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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    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
    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 expérimenté

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    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
    Membre habitué
    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
    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 expérimenté

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    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
    Membre habitué
    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
    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
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 419
    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 habitué
    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
    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