Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/04/2011, 10h41   #1
Candidat au titre de Membre du Club
 
Homme
Inscription : février 2009
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : février 2009
Messages : 44
Points : 13
Points : 13
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 :
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 :
Citation:
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
plastic1st est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 11h12   #2
Inscrit
 
Inscription : décembre 2004
Messages : 317
Détails du profil
Informations personnelles :
Âge : 23
Localisation : Singapour

Informations forums :
Inscription : décembre 2004
Messages : 317
Points : 437
Points : 437
Salut,

C'est ou que t'economises des requetes la ?
Doctrine_Core::getTable('Type') n'execute pas de requete on est bien d'accord ?
winzou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 11h17   #3
Candidat au titre de Membre du Club
 
Homme
Inscription : février 2009
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : février 2009
Messages : 44
Points : 13
Points : 13
euh... oui, c'est de ma faute, j'ai pas copié le bon code ;-)

Code :
1
2
3
4
5
6
 
    if(!sfConfig::get('app_types'))
    {  
      $this->types  = Doctrine_Core::getTable('Type')->getTypes();
      sfConfig::set('app_types', $this->types);    
    }
plastic1st est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 11h22   #4
Inscrit
 
Inscription : décembre 2004
Messages : 317
Détails du profil
Informations personnelles :
Âge : 23
Localisation : Singapour

Informations forums :
Inscription : décembre 2004
Messages : 317
Points : 437
Points : 437
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.
winzou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 11h33   #5
Candidat au titre de Membre du Club
 
Homme
Inscription : février 2009
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : février 2009
Messages : 44
Points : 13
Points : 13
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...
plastic1st est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 15h14   #6
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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)
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 15h30   #7
Candidat au titre de Membre du Club
 
Homme
Inscription : février 2009
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : février 2009
Messages : 44
Points : 13
Points : 13
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 ?
plastic1st est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 18h22   #8
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Dans le contrôleur tu récupères une instance de l'objet user
Code :
$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.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/04/2011, 03h29   #9
Inscrit
 
Inscription : décembre 2004
Messages : 317
Détails du profil
Informations personnelles :
Âge : 23
Localisation : Singapour

Informations forums :
Inscription : décembre 2004
Messages : 317
Points : 437
Points : 437
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
winzou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 07h52   #10
Candidat au titre de Membre du Club
 
Homme
Inscription : février 2009
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : février 2009
Messages : 44
Points : 13
Points : 13
Hello.

Merci Michel pour ta solution.
J'avais un peu avancé depuis mon dernier post, et j'étais arrivé à :
Code :
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 !
plastic1st est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 09h54   #11
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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...
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h04.


 
 
 
 
Partenaires

Hébergement Web