Bonjour,
350ms pour une requete SQL me parait beaucoup déjà, je suppose qu'il s'agit de l'ensemble du traitement (transformation DQL en SQL + execution requete SQL + transformation des résultats en Entité php) c'est à dire les informations du profiler section timeline, regarde également dans la section doctrine pour la durée effective des requetes SQL et voir si cela est optimisable.
Même si c'est l'ensemble du traitement Doctrine, ça parait beaucoup, regarde ci-dessous dans la section apc pour vérifier ta config.
Config
debug à false et environnement de production evidemment
Apc
Il existe un script pour analyser la gestion du cache apc.
ligne de commande pour le rendre public via un navigateur dans un répertoire "monitor"
ln -s /usr/share/doc/php-apc/apc.php /var/www/monitor
la valeur Cache full count doit être la plus basse possible (c'est le nombre de fois oû le cache de code apc a été vidé et vu le nombre de classe à charger avec Symfony2, il peut se remplir et se vider rapidement, auxquel cas il n'y a plus de valeur ajouté)
les paramètres sont à modifier dans /etc/php5/mods-available/apc.ini notamment le paramètre apc.shm_size
http://www.lecentre.net/blog/archives/1311
Un gros plus en performance c'est de configurer doctrine pour qu'il utilise le cache apc
(transformer une requete DQL en SQL c'est un traitement lourd)
1 2 3 4 5 6 7 8
|
# app/config/config.yml
# ....
orm:
entity_managers:
some_em:
query_cache_driver: apc
metadata_cache_driver: apc |
Composer
pour accélérer la localisation des classes PHP par l'autoloader,
générer un tableau associatif des classes et de la localisation de leur fichier
composer dump-autoload --optimize
(le fichier généré se trouvera dans vendor/composer/autoload_classmap.php)
Twig
il existe une extension C pour optimiser le rendu des valeurs dans twig
http://twig.sensiolabs.org/doc/insta...he-c-extension
Apache Router
Ne pas s'attarder, cette fonctionalité sera bientôt abandonner pour manque de performance voire contre-performance
Cache HTTP
http://symfony.com/fr/doc/current/book/http_cache.html
Avec le modele d'Expiration, ça peut se faire juste avec quelques anotations sur les controller
Avec le modele de validation par contre, cela demande un certain nombre de modif au niveau du code pour être efficace
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public function indexAction(Request $request){
//on récupère la date de dernière modification (en SQL, ce qui évite de charger Doctrine)
$sql='SELECT MAX(updated_at) FROM news';
$dateLastModification=$this->get('doctrine_default_connection')->fetchColumn();
//création d'un objet Response
$response = new \Symfony\Component\HttpFoundation\Response();
$response->setLastModified(new \DateTime($dateLastModification));
//comparaison avec la date connu par la requete envoyé par l'utilisateur, si aucune modif on renvoit simplement un code 304 not modified
if ($response->isNotModified($request)) {
return $response;
}
//si des articles ont été modifié depuis, traite la requete normalement (recupération DB + templating) et on fait :
$response->setContent($html);
return $response;
} |
Evidemment ça se complique lorsque l'on a des données propre à l'utilisateur en cours, dans ce cas, un chargement via Ajax des données perso reste le plus simple (voir le render avec hinclude http://symfony.com/fr/doc/current/bo...ec-hinclude-js )
Assets
comme dis plus haut compresser et minimiser les ressources css et js qui peuvent l'être (ça n'a pas de lien avec ton problème de lenteur sur la requete Symfony initiale, mais Symfony as tous les outils pour faire cela facilement)
Partager