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 :

Messages instantanés ( problème de performance )


Sujet :

Symfony PHP

  1. #1
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut Messages instantanés ( problème de performance )
    Bonjour a tous ,
    j'essaie de developper une discussion instantanée ( le plus proche possible de Facebook )
    des utilisateurs qui s'authentifient avec FOSUser .
    des utilisateurs en relations OneToMany avec des Messages .
    Aucun submit n'est autorisé dans mon cas .
    Je suppose que je suis un utilisateur 1 et que l'utilisateur 2 m'a envoyé un message ( je le reçois sans rien faire) .
    Mon problème c'est le cache qui touche 300 Mo en dev !!
    L 'affichage des messages peut etre beaucoup plus rapide .
    Nom : 800394Capture.jpg
Affichages : 233
Taille : 52,0 Ko

    Code Controlleur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
     public function indexAction(Request $request) {
     
            $user = $this->container->get('security.context')->getToken()->getUser();
            $em = $this->getDoctrine()->getManager();
     
            $message = new Message();
            $form = $this->createForm(new MessageType, $message);
            $request = $this->get('request_stack')->getCurrentRequest();
     
            if ($request->isXmlHttpRequest()) {
                $form->handleRequest($request);
                if ($form->isValid()) {
                    $message = $form->getData();
                    if ($user != NULL) {
                        $message->setUser($user);
                    }
                    $message->setLu(FALSE);
                    $em->persist($message);
                    $em->flush();
                    // exit;
                    $messages = $em->getRepository('MyAppTchatBundle:message')->findAll();
     
                    return $this->container->get('templating')->renderResponse('MyAppTchatBundle:Default:index.html.twig', array(
                                'messages' => $messages
                    ));
                }
            } /*elseif ($request->isMethod('Post')) {
                $form->bind($request);
                if ($form->isValid()) {
                    $message = $form->getData();
                    if ($user != NULL) {
                        $message->setUser($user);
                    }
                    $message->setLu(FALSE);
                    $em->persist($message);
                    $em->flush();
                    $messages = $em->getRepository('MyAppTchatBundle:message')->findAll();
                    return $this->redirect($this->generateUrl('my_app_tchat_homepage'));
                }
            } */else {
                $messages = $em->getRepository('MyAppTchatBundle:message')->findAll();
                return $this->render('MyAppTchatBundle:Default:index.html.twig', array('form' => $form->createView(),
                            'user' => $user, 'messages' => $messages));
            }
        }
     
        public function makevuAction(Request $request) {
     
            $em = $this->getDoctrine()->getManager();
            $user = $this->container->get('security.context')->getToken()->getUser();
     
            $messages = $em->getRepository('MyAppTchatBundle:message')->findBy(array(), array('datecreation' => 'DESC'));
     
            if ($request->isXmlHttpRequest()) {
                if (!empty($messages)) {
                    $message = $messages[0];  // $message est un objet
                    if ($message->getUser() != $user) {
                        $message->setLu(TRUE);
                        $message->setDatelu(new \DateTime());
                        $em->persist($message);
                        $em->flush();
                        //exit;  
                    }
                }
                return $this->container->get('templating')->renderResponse('MyAppTchatBundle:Default:index.html.twig', array(
                            'messages' => $messages, 'user' => $user
                ));
            }
        }
     
        public function showAction(Request $request) {
            $user = $this->container->get('security.context')->getToken()->getUser();
            $em = $this->getDoctrine()->getManager();
            if ($request->isXmlHttpRequest()) {
                $messages = $em->getRepository('MyAppTchatBundle:message')->findAll();
                return $this->container->get('templating')->renderResponse('MyAppTchatBundle:Default:ajaxresponse.html.twig', array(
                            'messages' => $messages, 'user' => $user
                ));
            } else {
                $messages = $em->getRepository('MyAppTchatBundle:message')->findAll();
                return $this->render('MyAppTchatBundle:Default:index.html.twig', array(
                            'messages' => $messages, 'user' => $user
                ));
            }
    Le code Javascript ( ajax et JQuery )
    Envoi de message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
       function CKupdate() { 
           for (instance in CKEDITOR.instances) CKEDITOR.instances[instance].updateElement();CKEDITOR.instances[instance].setData('');
       }     
        $(function () {
            $("#form_submit").submit(function (e) {
               CKupdate();
                e.preventDefault(); // Le navigateur ne peut pas envoyer le formulaire
                $.ajax({
                    type: 'post',
                    url: "{{path('my_app_tchat_homepage') }}",
                    data: $(this).serialize(),
                    datatype: "json",
                    cache: false,
                    success: function (data) {
                        $('#form_submit')[0].reset();
                    }
                });
                   $('#form_submit')[0].reset();
                // return false;
            });
        });
    Mettre un 'vu' pour les messages que j'ai lu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      $("div#inputid").click(function () {   /// lorsque je clique sur l input il voit " vu" j 'ai lu son message meme sans repondre
            $.ajax({
                type: 'post',
                url: "{{path('my_app_tchat_makevu') }}",
                data: $(this).serialize(),
                datatype: "json",
                cache: false,
                success: function (data) {
                    // $('div.panel-body').html(data);
                }
            });
        });
    Affichage automatique des messages régulierement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
       $(document).ready(function () {
        var refreshId = setInterval(function () {
                $.ajax({
                    type: 'post',
                    url: "{{path('my_app_tchat_show') }}",
                    data: $(this).serialize(),
                    datatype: "json",
                    cache: false,
                        success: function (data) {
                            $('div.panel-body').html(data);
                        }
                    });
            },1000);       // div qui contient les messages se rafraichie chaque 1 s
        });
    Merci d'avance

  2. #2
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    Citation Envoyé par mehrezlabidimehrez Voir le message
    Bonjour a tous ,
    Mon problème c'est le cache qui touche 300 Mo en dev !!
    Le cache de quoi ?
    APC, app/cache ?

    Quel est ton temps de réponse en environnement de production ?
    Peux tu mettre en place un système de paramètre pour le temps de rafraichissement ? pour avoir 1 seconde en env de prod, et 5 en dev ?

    Pour faire simple, en dev, chaque requête a tendance a régénérer beaucoup le cache, y compris celle faites en ajax. Sur une application, on arrive vite a 4-5 secondes de génération de page en environnement de dev, quand en prod on aura uniquement quelques millisecondes.

    Si tu rafraichis toutes les seconde quelque chose qui met 3-4 secondes a te répondre, tu vas créer une surcharge serveur pour rien.


    Autrement, que ton cache fasse 300MO n'est pas un problème. C'est de la mécanique interne de symfony qui va dupliquer pas mal de choses pour garantir une exécution rapide.


    autrement, sur ton application, je pense qu'il faudrait que tu regarde bien les notions de cache de resultat et d'invalisation de cache. Imagine que tu ai 5000 personnes connectées, tu aura 5000 requetes par secondes sur le chat. Ta base de donnée va se remplir très vite... jusqu'a peut etre exploser en vol avec des index qui ne suivront plus.
    A voir selon l'historique que tu gardes.

    Première piste d'amélioration, mettre du cache qui permet de ne pas envoyer de requetes si les données ne sont pas modifiées. (ce qui arrive souvent quand les gens laisse le site ouvert mais ne discutent plus.

    Seconde, d'utiliser un système d'échange de message qui stocke l'historique en BDD, mais qui a un système intermédiaire sur une base in memory par exemple.(reddis ?) Voir basé sur un système de queue. (Rabbit MQ)

    Bon courage,
    Pierre

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut
    Merci Pierre pour votre réponse, je débute avec Symfony et j'ai pas eu encore l'occasion pour le Prod . J'ai imaginé qu'une telle application (lente) pour un utilisateur ( connecté sur deux navigateurs pour tester ) va tomber a terre si elle va rencontrer des centaines d'utilisateurs simultanées .

    C'est trés important les deux pistes à la fin ,car envoyer des requêtes sans modifications est naze.
    De même pour le système intermédiaire et RabbitMQ( j'ai aucune idée et c'est une bonne occasion pour faire du "Google it") .

  4. #4
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    Si vous en etes au début, passez déjà en env de prod (au sens synfony) et regardez ce que ca donne après quelques requetes.

    Les premières devraient être super lente, les suivante(une fois le cache PHP / APC / Doctrine généré) beaucoup plus rapide.

    Bon courage.
    Pierre

Discussions similaires

  1. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17
  2. [jeu]problème de performance d'un algo
    Par le Daoud dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 30/05/2005, 16h07
  3. [C#] Probléme de performance avec IsDbNull
    Par jab dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/04/2005, 11h39
  4. [oracle 9i][Workbench]Problème de performance
    Par nuke_y dans le forum Oracle
    Réponses: 6
    Dernier message: 03/02/2005, 17h38
  5. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18

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