[Symfony] En attente localhost

Fermé
Jeremou51 Messages postés 37 Date d'inscription mardi 27 mai 2014 Statut Membre Dernière intervention 22 mai 2017 - 5 mai 2017 à 11:38
patrice86 Messages postés 1377 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 26 novembre 2023 - 5 mai 2017 à 16:55
Bonjour,

Voilà j'ai une question concernant les performances de Symfony.

Lorsque j'ouvre mon site j'ai ma page qui met 15-20sec à s'ouvrir et cela me marque dans le coin en bas à gauche "en attente de localhost"

Quelqu'un sait à quoi ca peut etre du ?

Merci d'avance pour vos réponses.

Symfony 2.8

4 réponses

ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 566
5 mai 2017 à 11:43
Salut,

Tu utilises quel serveur ?

Au passage, Symfony en est à la version 3.2.8, il vaut mieux oublier les versions 2.x
0
Jeremou51 Messages postés 37 Date d'inscription mardi 27 mai 2014 Statut Membre Dernière intervention 22 mai 2017 1
5 mai 2017 à 11:50
J'utilise Apache/2.4.18 (Win32)

Oui mais je n'ai pas trop le choix, le site existant est en 2.8 ^^, y'a t'il une réelle augmentation de la performance en 3.2.8 ?
0
ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 566
5 mai 2017 à 11:56
Je pensais que c'était un nouveau projet, la version 2.8 est une version LTS donc il n'y a pas vraiment de problème à l'utiliser.
Il y a probablement des améliorations de performance sur des points très spécifiques, mais ne te fatigue pas avec ça.

Pour ton problème... le site est hébergé sur ta machine ? Sur une machine distante ? Ca fonctionnait avant ?
0
Jeremou51 Messages postés 37 Date d'inscription mardi 27 mai 2014 Statut Membre Dernière intervention 22 mai 2017 1
5 mai 2017 à 12:02
Alors j'ai une version chez moi, mis en place grâce à uwamp, j'ai aussi une version sur une machine distante pour une version prod, toujours avec uwamp, dans les 2 cas j'ai un temps en attente d'environ 20secondes, et ensuite le site répond. Non il y a toujours eu cette attente mais je pensais que cela venait de ma machine, mais finalement tout les utilisateurs ont ca
0
patrice86 Messages postés 1377 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 26 novembre 2023 125
5 mai 2017 à 12:21
As-tu la possibilité de tester sur un serveur de prod ?
Pas normal d'avoir autant de latence en local. 15-20secondes, je balance le PC par la fenêtre si je suis entrain de développer :)

Peut-être un soucis au niveau du cache qui prend trop de temps.
Regardes sur internet (je ne me souviens plus des noms), certaines extensions PHP permettent d'accélérer le temps d’exécution de symfony.
Lances le script web/config.php, il dois en citer je crois.
0
Jeremou51 Messages postés 37 Date d'inscription mardi 27 mai 2014 Statut Membre Dernière intervention 22 mai 2017 1
5 mai 2017 à 13:13
J'ai en effet un server de prod, mais j'ai le meme resultat qu'en local, j'ai un autre site qui tourne sur ce server et cela prend environ 2-3 secondes pour s'ouvrir donc vraiment parfait.
Oui en effet c'est assez frustrant de tester et d'attendre 20sec à chaque fois ^^ et j'ai un zbook ^^
merci je vais regarde à ca
0
ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 566
5 mai 2017 à 12:27
J'ai eu des soucis relativement similaires récemment sur un site.
Le problème venait de requêtes qui étaient très très mal optimisées.

J'ai beaucoup cherché, autant des améliorations des performances du serveur web, que de PHP.

Mais le problème venait "juste" de mes requêtes. Une fois que j'ai mis le doigt là dessus, j'ai pu corriger le problème et je suis passé d'un site qui s'affichait en plus de 10s à un affichage en 1 à 2 secondes
0
patrice86 Messages postés 1377 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 26 novembre 2023 125
5 mai 2017 à 12:42
L'éternel optimisation des requêtes SQL et/ou doctrine. Il est vrai que bien souvent, une requête complexe peut prendre plus de temps que prévu alors que si elle est correctement optimisé avec Doctrine, c'est immédiat.
0
Jeremou51 Messages postés 37 Date d'inscription mardi 27 mai 2014 Statut Membre Dernière intervention 22 mai 2017 1
5 mai 2017 à 13:17
D'accord je vois ce que tu veux dire, bon je vais tenter de regarder un peu de ce côté là dans ce cas.

La plus part des requetes que j'utilise sont soient des findBy ou alors des fonctions de queryBuilder mais si c'est aussi long je pense qu'il y a de l'amelioration à effectuer

Merci bien
0
ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 566
Modifié le 5 mai 2017 à 14:50
Et bien moi aussi, le soucis n'est pas tant la complexité des requêtes, que le "volume" des données retournées.

Quand tu dois retourner beaucoup d’éléments, que tu as de multiples requêtes sur ta page et que tu as beaucoup de relations bilatérales sur tes entités, alors il y a de grandes chances que tu rencontres les mêmes difficultés que j'ai rencontré avant toi.

En développement, je n'avais pas trop de soucis, tant que le volume restait faible, je test mes fonctionnalités, ça tourne, c'est super, le problème arrive quand on commence à avoir pas mal de données...

Jette un oeil à ce sujet que j'avais ouvert pour tenter de solutionner mon problème : https://stackoverflow.com/questions/42856302/access-entity-methods-with-getarrayresult

Dans mon cas, le problème venait justement de ces "findBy" and co qui te retournent une collection d'objets, c'est comme ça basiquement que symfony est censé fonctionner, c'est magique, ça fonctionne hyper bien, on a accès à tous les objets et leurs méthodes, c'est super, sauf que c'est lourd, très lourd...

Ma solution a consisté à créer à chaque fois des méthodes dans mes repository pour obtenir les données dont j'ai besoin et rien d'autre !

Je m'explique, au lieu de rapatrier mes objets, je récupère uniquement les champs qui m'intéressent, à la manière d'une requête SQL classique, ainsi, c'est beaucoup plus léger, il faut évidemment faire tes jointures comme il faut pour récupérer les champs d'autres entités.

Par exemple :


    public function getInventory(User $user)
    {
        $qb = $this
                ->createQueryBuilder('i')
                ->select(array(
                    'i.id',
                    'i.title',
                    'i.price',
                    'i.codePrivate',
                    'i.quantity',
                ))
                ->leftJoin('i.category', 'c')
                ->addSelect(array(
                    'c.id AS c_id',
                    'c.title AS c_title'
                ))
                ->leftJoin('i.user', 'u')
                ->andWhere('u.id = :idUser')
                ->setParameter('idUser', $user->getId())
                ->andWhere('i.advert IS NULL')
                ->orderBy('c.title')
                ->addOrderBy('i.title')
        ;

        return $qb
                        ->getQuery()
                        ->getResult()
        ;
    }


De même quand je veux récupérer un nombre d'éléments, je ramenais la collection d'éléments qui m'intéressaient et je faisais un count() en php.

On en revient à un principe essentiel : tout ce que tu peux faire côté SQL, il faut le faire côté SQL, ne pas ramener un maximum d'infos et ensuite faire ton tri en PHP, c'est très lourd. Un peu comme le SELECT *, il faut être exhaustif dans ce qu'on veut obtenir.

Ceci étant dit, ça a été ma solution, qui fonctionne bien, après ça ne sera peut être pas ta réponse, mais ça peut être une piste, peut être qu'il y a d'autres optimisations à faire que je n'avais pas faites qui auraient pu m'éviter des problèmes...
Mais après avoir cherché pendant des jours, j'ai finalement trouvé cette réponse, mais malgré le fait qu'il y a des tonnes de sujets sur l'optimisation symfony, aucun n'a énoncé ce principe simple, qui une fois qu'on le dit, semble tellement évident...

Du coup, ce que je fais : quand je dois récupérer plusieurs objets d'une même entité, je récupère seulement les champs qui m'intéressent, et quand je dois récupérer un objet, pour l'afficher ou le modifier, là je peux récupérer l'entité entière, ça sera beaucoup moins lourd.

En espérant avoir apporté quelques lumières... parce que j'y ai perdu beaucoup de temps...
0
patrice86 Messages postés 1377 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 26 novembre 2023 125
5 mai 2017 à 15:05
Tu entends quoi par "quand on commence à avoir pas mal de données... "
La plus grosse BDD sur laquelle je travaille (avec Symfony 3.2) fait 1.3Go en tout avec 500 000 enregistrements dans la plus grosse table. Je n'ai pas de soucis de latence en prod.
0
ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 566 > patrice86 Messages postés 1377 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 26 novembre 2023
5 mai 2017 à 15:54
Dans mon cas la taille des tables n'est pas énorme en soit, environ 2000 enregistrements on va dire, mais j'avais plusieurs requêtes qui sollicitaient ces enregistrements et il y a pas mal de relations entre mes nombreuses entités (mais je pense que la complexité de mon appli n'est pas hors du commun...)
Donc le soucis se situe peut être plus au niveau des relations entre entités dans mon cas, je ne sais pas... mais ça m'intéresse de connaitre ta façon de requêter et de construire tes relations entre entités.
Je fais quasiment systématiquement des relations bilatérales, ce n'est probablement pas optimal du tout...
0
Jeremou51 Messages postés 37 Date d'inscription mardi 27 mai 2014 Statut Membre Dernière intervention 22 mai 2017 1
5 mai 2017 à 15:06
Oui c'est clairement une grande aide.

C'est vrai que je ramène énormément de data (environ 4500 requêtes) des l'ouverture de ma page d'accueil. J'ai 8 selectize, qui se remplissent différent suivant les valeurs choisies (c'est un espèce filtre en faite pour effectuer une recherche), donc je suis parti du principe que je voulais perdre mon temps à tout charger au début, plutôt que d'effectuer des requêtes ajax des que je changeais un selectize. Pareil ce n'est peut être pas la bonne idée de départ....

Vraiment Symfony est magique, mais l'optimisation reste complexe ^^
0
patrice86 Messages postés 1377 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 26 novembre 2023 125
5 mai 2017 à 16:55
4500 requêtes au démarrage de ton application ? Il y a un 0 en trop rassure moi ?
Tu m'étonnes que ton application est longue à charger.
Tu devrais faire des requêtes en ajax et charger le strict minimum au lancement de ton appli.
Si mon appli prend 15-20 secondes à s'afficher, mes clients ne seraient pas content du tout.
0