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

Langage PHP Discussion :

Une requête toute les secondes, n'est ce pas trop pour le serveur ?


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de elcoyotos
    Homme Profil pro
    Amateur passionné
    Inscrit en
    Octobre 2006
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Amateur passionné

    Informations forums :
    Inscription : Octobre 2006
    Messages : 490
    Points : 294
    Points
    294
    Par défaut Une requête toute les secondes, n'est ce pas trop pour le serveur ?
    Bonjour,

    Je suis en train de développer un chat en php/ajax.

    J'actualise le contenant des messages via une requête ajax qui lance un select dans ma base de données. La fréquence d'actualisation est toutes les 1 seconde.

    Sachant que je suis en mutualisé chez OVH : Une requête toute les secondes, n'est ce pas trop pour le serveur ?

    Si oui, comment faire autrement ?

    Merci d'avance de vos réponses

    PS : Pour les devs -> Il n'y a pas PHP8 dans les préfixes

  2. #2
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Bonjour,

    C'est difficile de répondre à ce genre de question
    Il faudrait connaître la charge qu'utilise l'exécution du script et la multiplier par le nombre de personnes potentielles

    Un serveur peut facilement gérer plusieurs centaines de requêtes PAR SECONDE, donc tant qu'il n'y a que quelques utilisateurs, ça ne sera pas forcément un problème mais ça peut très très vite le devenir
    Surtout sur des serveurs mutualisés qui sont généralement moins puissants que des serveurs dédiés

    Quoi qu'il en soit, je vous conseillerais plutôt d'aller voir du côté de NodeJS (cependant pas possible sur un serveur mutualisé à ma connaissance) grâce à Express et socket.io dont c'est le "travail"
    D'ailleurs le Getting Started de Socket.io est justement un live chat (c'est sûrement pcq c'est ce que veulent le plus les gens ^^) : https://socket.io/get-started/chat

    En plus, ils permettent de créer des choses beaucoup plus complexes comme le fait de regrouper des personnes (salons ou direct message)
    Ce serveur fonctionne sur le principe d'une boucle infinie et donc on est dans du VRAI live (pas toutes les secondes)

  3. #3
    Membre actif Avatar de elcoyotos
    Homme Profil pro
    Amateur passionné
    Inscrit en
    Octobre 2006
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Amateur passionné

    Informations forums :
    Inscription : Octobre 2006
    Messages : 490
    Points : 294
    Points
    294
    Par défaut
    Bonjour,

    Merci pour ta réponse qui m'éclaire tout de même. Pour la charge qu'utilise l'exécution du script, je ne sais pas comment calculer cela (est ce possible sur un mutualisé ?)
    Quant au le nombre de personnes potentielles, il est bas. Moins d'une dizaine...

    Pour nodejs, ce n'est effectivement pas proposé sur un mutualisé. Je vais quand même regardé Getting Started de Socket.io par curiosité....

  4. #4
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Bonjour,

    Je t'avoue que les calculs de charge ce n'est pas ma spécialité et encore moins sur un serveur mutualisé où on a pas vraiment accès à ces données malheureusement.

    Je pense que de toute façon, si tu consommes trop, t'auras un avertissement d'OVH

    Personnellement, avant de passer sur du Socket.io, je faisais le même système que toi mais par contre, j'augmentais tout simplement le timeout (temps entre les requêtes)

    Il me semble que j'avais 15 secondes et que ça passait smooth pour plus de 100 personnes.
    Surtout que si t'es pas en direct/live, que tu aies 1s de délai ou 15s, ça ne se voit pas forcément trop
    Je te conseille de toute façon de mettre cette valeur dans une variable afin de pouvoir jouer avec.
    Tu pourrais même envisager de compter le nombre de personnes connectées et d'augmenter/diminuer le timeout en fonction (si ça devenait nécessaire)

    Il est évident par contre qu'il faut éviter de charger trop de trucs inutiles. Par exemple, si tu comptes charger tout ton site web pour juste extraire la valeur qui se trouve dans un input, ça n'aurait pas de sens ^^

  5. #5
    Membre actif Avatar de elcoyotos
    Homme Profil pro
    Amateur passionné
    Inscrit en
    Octobre 2006
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Amateur passionné

    Informations forums :
    Inscription : Octobre 2006
    Messages : 490
    Points : 294
    Points
    294
    Par défaut
    Bonjour,

    Effectivement, si je consomme trop, j'aurai un avertissement d'OVH
    C'est ce que j'ai fait (augmenter le timeout)

    Tu pourrais même envisager de compter le nombre de personnes connectées et d'augmenter/diminuer le timeout en fonction (si ça devenait nécessaire)]
    C'est une excellente idée !

    Merci d'avoir pris du temps pour me répondre...

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Globalement , faire un chat en polling c'est une mauvaise idée , car comme tu as pu t'en rendre compte c'est problématique d'un point de vue performance.

    La bonne solution est bien évidemment de faire du push avec des websocket par exemple.

    Dans le cas ou ce n'est pas une options , il faut à minima faire du polling intelligent :

    Avoir un l'intervalle de requêtage faible au début (par ex 1x/s) , puis si pas de nouveau message depuis un certains temps augmenter exponentiellement (jusqu à une certaine limite) afin de soulager le serveur quand il ne se passe rien. Dès qu'un changement apparait on repart sur un polling rapide.
    Adapter l'intervalle en fonction du nombre de client est également une bonne idée.

  7. #7
    Membre actif Avatar de elcoyotos
    Homme Profil pro
    Amateur passionné
    Inscrit en
    Octobre 2006
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Amateur passionné

    Informations forums :
    Inscription : Octobre 2006
    Messages : 490
    Points : 294
    Points
    294
    Par défaut
    Bonjour,

    Merci pour vos conseils que je vais suivre...

  8. #8
    Membre actif Avatar de elcoyotos
    Homme Profil pro
    Amateur passionné
    Inscrit en
    Octobre 2006
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Amateur passionné

    Informations forums :
    Inscription : Octobre 2006
    Messages : 490
    Points : 294
    Points
    294
    Par défaut
    Avoir un l'intervalle de requêtage faible au début (par ex 1x/s) , puis si pas de nouveau message depuis un certains temps augmenter exponentiellement (jusqu à une certaine limite) afin de soulager le serveur quand il ne se passe rien. Dès qu'un changement apparait on repart sur un polling rapide.
    Adapter l'intervalle en fonction du nombre de client est également une bonne idée.
    @grunk Du coup, j'en suis là :
    Comment régler l'intervalle de requête en fonction du nombre de messages/utilisateur sans interroger la base de données toutes les x secondes ?
    Car sinon, ça ne sert à rien pour soulager le serveur des x requête toutes les x secondes pour afficher les données, de l'interroger toutes les x secondes pour savoir s'il y a de nouvelles données...
    J'avoue que je ne comprends pas comment faire
    Aurais-tu une piste à me suggérer.

  9. #9
    Membre éclairé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 351
    Points : 719
    Points
    719
    Par défaut
    Bonjour,

    Tu pourrais aussi faire du long polling, c-a-d laisser la requête en attente et y répondre uniquement lorsqu'un nouveau message arrive.
    Mais comme précisé par grunk, faire du push avec les websockets, les server-sent events ou le protocole Mercure seraient de meilleures solutions.

    Sur la chaine youtube de l'AFUP, tu peux trouver la présentation "Propulser du temps réel avec PHP en 2020 !" qui donne plus de détails sur ces différentes solutions :

  10. #10
    Membre actif Avatar de elcoyotos
    Homme Profil pro
    Amateur passionné
    Inscrit en
    Octobre 2006
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Amateur passionné

    Informations forums :
    Inscription : Octobre 2006
    Messages : 490
    Points : 294
    Points
    294
    Par défaut
    Merci Pytet pour ta réponse.

    Comme précisé dans les précédents messages, je suis en mutualisé. Donc, d'après ce que j'ai compris, le longpooling et nodejs, il faut oublié...
    Je vais regarder du côte des websockets, de server-sent events ou du protocole Mercure...

  11. #11
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Citation Envoyé par elcoyotos Voir le message
    Comment régler l'intervalle de requête en fonction du nombre de messages/utilisateur sans interroger la base de données toutes les x secondes ?
    Je ferais ca coté client.
    Par exemple :
    - Tu commences avec un polling à 1s
    - Pas de message reçus après Xs tu passe à 5s
    Et ainsi de suite jusqu'à un intervalle que tu juge acceptable pour la réactivité de ton appli et la santé de ton serveur.

  12. #12
    Membre actif Avatar de elcoyotos
    Homme Profil pro
    Amateur passionné
    Inscrit en
    Octobre 2006
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Amateur passionné

    Informations forums :
    Inscription : Octobre 2006
    Messages : 490
    Points : 294
    Points
    294
    Par défaut
    @grunk : Je comprend comment faire et je te remercie de ta reponse.
    Ce que je ne comprend pas c'est que pour
    Pas de message reçus après Xs tu passe à 5s
    Il faut bien que j'interroge le serveur ?
    Donc, il faut encore un timeout supplémentaire ?
    Dans ce cas, au lieu de diminuer les requetes, j'en ajoute ???
    C'est cela que je ne comprens pas...
    Peux tu me montrer un exemple de code ?

  13. #13
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Il faut bien que j'interroge le serveur ?
    Oui , et ca tu le fais déjà.

    Donc, il faut encore un timeout supplémentaire ?
    Non

    Exemple :

    00.00 pull - message
    00.01 pull
    00.02 pull
    00.03 pull
    00.04 pull
    00.05 pull - Pas de message depuis 5 secondes , augmentation du timeout
    00.10 pull
    00.15 pull - message , réduction du timeout
    00.16 pull
    etc ...

  14. #14
    Membre actif Avatar de elcoyotos
    Homme Profil pro
    Amateur passionné
    Inscrit en
    Octobre 2006
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Amateur passionné

    Informations forums :
    Inscription : Octobre 2006
    Messages : 490
    Points : 294
    Points
    294
    Par défaut
    Bon sang mais c'est bien sur !
    Merci grunk pour ton exemple limpide

  15. #15
    Membre actif Avatar de elcoyotos
    Homme Profil pro
    Amateur passionné
    Inscrit en
    Octobre 2006
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Amateur passionné

    Informations forums :
    Inscription : Octobre 2006
    Messages : 490
    Points : 294
    Points
    294
    Par défaut comment transmettre mon timeout ?
    C'est encore moi avec mon timeout
    Cette fois, je bloque sur comment transmettre mon timeout.

    Je m'explique : J'ai 2 pages.
    1. La page qui affiche le chat dans laquelle il y a le javascript avec le timeout. Mettons, la page index.php
    2. La page qui est actualisé par le timeout et qui envoie les données à la page index. Mettons ajax_chat.php


    Comment actualiser le timeout dans la page index.php ?

  16. #16
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Tu es plus sur une problématique javascript que PHP maintenant , mais suffit faire un clearTimeout() quand il doit changer et de le recreer avec la nouvelle valeur

  17. #17
    Membre actif Avatar de elcoyotos
    Homme Profil pro
    Amateur passionné
    Inscrit en
    Octobre 2006
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Amateur passionné

    Informations forums :
    Inscription : Octobre 2006
    Messages : 490
    Points : 294
    Points
    294
    Par défaut
    Oui effectivement, maintenant je suis sur le javascript. Merci grunk pour la piste. Je vais regarder ce que je peux faire avec clearTimeout()

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modifier une structure toutes les secondes
    Par jmathon dans le forum Débuter
    Réponses: 1
    Dernier message: 20/10/2008, 14h49
  2. [MySQL] Execution d'une requête toutes les 24 heures
    Par jcaspar dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 19/09/2008, 14h47
  3. Réponses: 1
    Dernier message: 16/05/2007, 15h52
  4. Réponses: 2
    Dernier message: 20/04/2007, 12h48
  5. Réponses: 2
    Dernier message: 12/03/2007, 16h05

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