1 pièce(s) jointe(s)
Requête doctrine s'exécutant 4 fois dans un listener
Bonjour à tous,
Cela fait très longtemps que j'explore ce site que je trouve vraiment pas mal, mais je ne m'étais jamais inscrit, car jamais l'occasion de le faire.
Je me permet de venir à vous pour un problème un peu particulier, et malgré mes recherches sur la toile, je n'ai rien trouvé de concluant. J'explique ce que je compte faire et mon problème.
Pour mon site en symfony 2.5, j'ai décidé de mettre en place un mode Maintenance relié à la base de données, qui me permettrais de mettre en site en maintenance depuis l'administration.
La mise en place de ce listener fonctionne très bien, je fais bien appel au service dans le config.yml comme vous voyez ci-dessous :
Code:
1 2 3 4 5 6
| services:
dcl.listener.maintenance:
class: DCL\ParametersBundle\Listener\MaintenanceListener
arguments: ["@service_container"]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } |
Mais quand je vais sur la page d'accueil du site depuis l'environnement de dev, la toolbar m'indique que 4 requêtes ont été effectué. Quand je me dirige sur le profiler, voici ce que je vois :
Pièce jointe 154595
La requête comme vous le voyez s'exécute 4 fois ! Alors que je ne la demande qu'une fois. Si on va sur une autre page que l'accueil, la requête est bien exécuté qu'une seule fois. Bien évidemment, cela ne représente que 2ms niveau requête pour l'ensemble, mais si on multiplie par le nombre de requête que je vais devoir mettre, on arrivera à tes temps de chargement assez long, surtout quand le site sera beaucoup fréquenté.
J'aurais donc besoin de vos conseils, et de voir quel est l'origine de cette quadruple exécution.
Au besoin, voici la classe MaintenanceListener si cela vous intéresse.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class MaintenanceListener
{
private $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public function onKernelRequest(GetResponseEvent $event)
{
$doctrine = $this->container->get('doctrine')
->getManager()
->getRepository('DCLParametersBundle:Parameters')
->findOneByName('maintenance_mode');
$maintenance = $doctrine->getValue();
$debug = in_array($this->container->get('kernel')->getEnvironment(), array('test', 'dev'));
if ($maintenance && !$debug) {
$engine = $this->container->get('templating');
$content = $engine->render('::maintenance.html.twig');
$event->setResponse(new Response($content, 503));
$event->stopPropagation();
}
}
} |
Je vous remercie par avance de votre aide et de vos conseils,
Marc