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 :

variables globales dans symfony [1.x]


Sujet :

Symfony PHP

  1. #1
    Invité
    Invité(e)
    Par défaut variables globales dans symfony
    Hello.

    Est-il possible avec Symfony de charger le contenu d'une table dans une variable globale, de façon à économiser quelques requêtes au chargement de chacune des pages d'un site ?

    J'ai testé le code suivant dans actions.class :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        if(!sfConfig::get('app_types'))
        {  
          $this->types  = Doctrine_Core::getTable('Type');
          sfConfig::set('app_types', $this->types);    
        }
    Ce qui me renseigne bien la variable app_type, mais si on passe à un autre module que le module 'type', la variable n'est pas renseignée.

    L'idéal serait donc de renseigner ma variable globale dans projectConfiguration.class. J'ai essayé avec un tableau statique, et ça fonctionne.
    Par contre, impossible d'accéder à ma base avec le code ci-dessus.

    J'obtiens le message d'erreur suivant :
    Fatal error: Class 'Doctrine_Core' not found in C:\dev\sfproject\project\config\ProjectConfiguration.class.php on line 35
    Quelqu'un aurait-il une solution ?

    Merci d'avance

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Salut,

    C'est ou que t'economises des requetes la ?
    Doctrine_Core::getTable('Type') n'execute pas de requete on est bien d'accord ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    euh... oui, c'est de ma faute, j'ai pas copié le bon code ;-)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        if(!sfConfig::get('app_types'))
        {  
          $this->types  = Doctrine_Core::getTable('Type')->getTypes();
          sfConfig::set('app_types', $this->types);    
        }

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Mais je comprends pas pourquoi ca te fait economiser une requete. Ca ne fait que la deplacer la, ou alors j'ai pas bien compris.

  5. #5
    Invité
    Invité(e)
    Par défaut
    L'idée c'est de renseigner les <option> d'un <select>.
    Si j'ai un <select> commun à plusieurs pages, je vais être obligé d'aller chercher mes valeurs dans ma base à chaque changement de page.

    Alors que si je renseigne mes valeurs dans une variable globale une fois pour toutes, à chaque changement de page, pas besoin d'aller fouiller dans ma base, je renseigne directement mon <select> à partir de ma variable globale.

    Et si j'ai 10 select sur chaque page, j'économise 10 requêtes à chaque fois...
    Dernière modification par Invité ; 14/04/2011 à 14h18.

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    sfConfig est plus proche d'une constante que d'un stockage intermédiaire.

    Pour le faire simplement, tu peux stocker dans le paramterHolder de l'objet MyUser qui est constant entre les sessions.

    Si tes select sont les mêmes pour tous les utilisateurs, il faudrait voir du côté du cache sfViewCacheManager il est peut-être possible de torturer la chose pour y cacher un array de data. (jamais fais)

  7. #7
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse !

    Effectivement mes <select> seront constants.
    Pour ta deuxième solution, s'il faut passer à la torture, je crois que je vais laisser tomber. Je ne suis pas encore assez aguerri avec Symfony...

    Je vais donc opter pour la solution simple
    Par contre, juste une question, comment on accède au parameterHolder ?

  8. #8
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Dans le contrôleur tu récupères une instance de l'objet user
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $user = $this->getUser()
    Ensuite tu peux y arriver directement par les raccourcis de l'objet user et ou récupérer un pointeur sur le Holder par un et utiliser toutes les méthodes qui sont décrites ici.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Mais Doctrine1 met en cache ta requete non ?
    C'est sur en tout cas que si tu fais 10 fois la meme requete avec Doctrine2, il ne fera qu'une seule fois la requete au serveur SQL et ensuite te sert du cache tout chaud.
    Verifie en faisant 10 fois ta requete dans ton controlleur et regarde ce que le profiler te dit sur les requetes reellement executees. Inutile de reinventer la roue si Doctrine s'occupe deja de tout

  10. #10
    Invité
    Invité(e)
    Par défaut
    Hello.

    Merci Michel pour ta solution.
    J'avais un peu avancé depuis mon dernier post, et j'étais arrivé à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public function executeIndex(sfWebRequest $request)
    {
      $query = $request->getParameter('query');
      $request->getParameterHolder()->set('param', 'value');
      ...
    }
    qui renseignait bien le paramètre dans le parameterHolder, mais je perdais cette valeur en changeant de page. Je n'avais pas pensé à utiliser l'objet user. En tout cas, cette fois-ci, je garde bien mon paramètre d'une page à l'autre.

    Un grand merci pour ton aide !!!!


    Citation Envoyé par winzou Voir le message
    Mais Doctrine1 met en cache ta requete non ?
    C'est sur en tout cas que si tu fais 10 fois la meme requete avec Doctrine2, il ne fera qu'une seule fois la requete au serveur SQL et ensuite te sert du cache tout chaud.
    Verifie en faisant 10 fois ta requete dans ton controlleur et regarde ce que le profiler te dit sur les requetes reellement executees. Inutile de reinventer la roue si Doctrine s'occupe deja de tout
    J'ai essayé d'exécuter plusieurs fois la même requête, et elles sont à chaque fois exécutées.

    Merci à vous deux d'avoir pris un peu de temps pour m'aider !

  11. #11
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Doctrine 1 à la possibilité de mettre des requêtes en cache. Cette possibilité n'est pas exploité naturellement dans symfony 1. Je ne suis pas sur qu'elle soit utilisable.

    Doctrine 2 (qui tourne avec Symfony2) a la possibilité d'utiliser des proxy, sorte de cache disque ou APC. Ceci accélère largement le traitement des données.

    Maintenant, d'expérience sur un formulaire affiché, le plus lourd en temps n'est pas l'accès aux données mais le traitement des données après et la transformation du tableau d'option en liste d'option html. Ce traitement peut être jusqu'à 10 fois plus long que la requête elle même (suivant le nombre de données à traiter). Donc ce qu'il serait optimal c'est la mise en cache non pas du tableau des données mais du html généré pour la liste. Hélas cela demanderais la réécriture du widget select...

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

Discussions similaires

  1. [2.x] variable globale dans symfony ?
    Par domino974 dans le forum Symfony
    Réponses: 2
    Dernier message: 18/07/2011, 04h43
  2. [1.x] Variable globale dans Symfony
    Par SRTPC dans le forum Symfony
    Réponses: 3
    Dernier message: 02/06/2008, 19h51
  3. Variables globales dans une classe
    Par vanitom dans le forum C++
    Réponses: 16
    Dernier message: 14/01/2005, 14h40
  4. Variables globales dans fichiers entête
    Par benj_f04 dans le forum C++
    Réponses: 5
    Dernier message: 13/08/2004, 09h06
  5. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 19h22

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