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 :

problème performance symfony2 [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Par défaut problème performance symfony2
    Bonjour,

    J'utilise les formulaires et je me rends compte qu'il fait beaucoup de requêtes ( il y a pleins de doublons ).

    Par exemple j'ai une classe telephone :
    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
     
    class Telephone implements NormalizableInterface
    {
     
      ....
    	/**
    	* @var IML\DefaultBundle\Entity\Code\TypeTelephone
    	*
    	* @ORM\ManyToOne(targetEntity="IML\DefaultBundle\Entity\Code\TypeTelephone")
    	*/
    	private $typeTelephone;
     
        /**
        * @var IML\DefaultBundle\Entity\User $user
        *
        * @ORM\ManyToOne(targetEntity="User")
        */
        private $user;
    }
    Elle est donc lié à une autre classe TypeTelephone et classe User.
    Quand je créé un formulaire qui permet d'ajouter plusieurs téléphones. Quand je regarde les requêtes dans le profiler je me rends compte qu'il fait un appel à la base de donnée pour récupérer les TypeTelephone pour chaque téléphone.
    Et c'est qu'un exemple. Alors est-ce que vous connaissez un moyen pour éviter ou limiter ce genre d'action?? Car il pourrait faire une seul requete pour chercher tout les typeTelephone et les mettre dans un tableau et faire appel a ce tableau pour connaître le champ!

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Tu peux passer directement ta collection via l'option choice:

    http://www.developpez.net/forums/d11...es-identiques/

    ou bien gérer un cache dans ton repository
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #IML\DefaultBundle\Entity\Code\TypeTelephoneRepository
     
     protected $allResults;
     
     public function findAll(){
      if(null===$this->allResults){
       $this->allResults=parent::findAll();
      }
      return $this->allResults;
     }

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Par défaut
    Lorsque tu recuperes ton user, il ne fait pas la jointure automatiquement.

    Tu as deux solutions:
    - faire une requete incluant un left join sur le typetelephone. J'avoue, c'est pas la plus simple. Mais au moins tu le charges que si necessaire.

    - utiliser l annotation fetch="EAGER" pour que le join se fasse automatiquement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	/**
    	* @var IML\DefaultBundle\Entity\Code\TypeTelephone
    	*
    	* @ORM\ManyToOne(targetEntity="IML\DefaultBundle\Entity\Code\TypeTelephone", fetch="EAGER")
            * @ORM\JoinColumn(name="type_telephone", referencedColumnName="id")  
    	*/
    	private $typeTelephone;
    Tu fais le même dans ta classe user pour récupérer les téléphones.


    Si cela fonctionne, je te suggère le petit .

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Par défaut
    Re,

    Effectivement le nombre de requêtes a diminué mais en regardant le profiler j'ai des requêtes qui se font avec aucun paramètre...

    Genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT t0.id AS id1, t0.libelle AS libelle2 FROM c_sexe t0
    Parameters: { }
    Time: 0.73 ms
    Par contre la technique avec la création des classes Type, est-ce qu'elle est efficace?

  5. #5
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    Symfony2 est dans l'ensemble plus lent que symfony 1.4. En revanche si tous les caches sont activés alors la oui symfony2 explose symfony 1.4.

    Tous est basé sur le cache, je vais essayer de retrouver le slide parlant de ça.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Par défaut
    Ah ben sa serait sympas merci!

  7. #7
    Membre expérimenté

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Par défaut
    Citation Envoyé par rafleboss Voir le message
    Re,

    Effectivement le nombre de requêtes a diminué mais en regardant le profiler j'ai des requêtes qui se font avec aucun paramètre...

    Genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT t0.id AS id1, t0.libelle AS libelle2 FROM c_sexe t0
    Parameters: { }
    Time: 0.73 ms
    Par contre la technique avec la création des classes Type, est-ce qu'elle est efficace?
    Pour moi c'est normal que ta requête n'ai pas de paramètre, c'est un select * sans clause where.

    Et pour les perfs je pense que c'est faux. SF2 et globalement plus performant que SF1 et encore plus quand tu actives le cache. Par contre si tu l'utilise sous windows ce sera très lent, car pour vérifier les fichiers a charger, php utilise la fonction filemtime qui est très lente sous windows.

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 19/02/2007, 14h13
  2. Réponses: 2
    Dernier message: 24/05/2006, 13h30
  3. Réponses: 1
    Dernier message: 24/05/2006, 12h46
  4. Réponses: 7
    Dernier message: 21/11/2005, 14h21
  5. Problème performance SELECT avec jointure
    Par Netgamer dans le forum Requêtes
    Réponses: 7
    Dernier message: 05/08/2005, 10h20

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