JeuWeb - Crée ton jeu par navigateur
[AJAX] dans le cas où plusieures fenêtres du navigateur sont ouvertes - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [AJAX] dans le cas où plusieures fenêtres du navigateur sont ouvertes (/showthread.php?tid=4787)

Pages : 1 2


[AJAX] dans le cas où plusieures fenêtres du navigateur sont ouvertes - php_addict - 05-05-2010

bonjour

je me pose une question concerant l'AJAX et la charge du serveur, je m'explique.

j'ai un script JS/AJAX qui fait une requete SQL au serveur toutes les 30 secondes (parametrable, ca pourra être 2 minutes...)

mais il est possible que les internautes laissent ouvert leur navigateur avec plusieurs onglets ouverts...si il y a 20 onglets ouvert, ca fait 20 requêtes simultanées. (rien dans mon mmorpg n'incite a ouvrir 20 onglets, mais on ne sais jamais, les gens font des trucs étranges parfois Smile )

mes transactions ne font pas bugger mes scripts dans un tel cas, là n'est pas le problème, mais c'est une charge inutile pour le serveur, non...?

qu'en pensez vous?

je dois mettre un jeton token dans mes requêtes ajax, et parallèlement je me demandais si il fallait empêcher les 20 requêtes des 20 onglets du navigateur (dans un tel cas...)...

merci de m'avoir lu Wink

bonne journée !


RE: [AJAX] dans le cas où plusieures fenêtres du navigateur sont ouvertes - Sephi-Chan - 05-05-2010

Tu peux mettre une variable Javascript booléenne (ou, et je préfère ça, utiliser un attribut personnalisé sur un élément du DOM (<body data-active-user="true">, par exemple)) qui indique l'état d'activité du joueur sur la page.

Si l'utilisateur ne fait rien pendant 30 secondes, ça passe le booléen à false et arrête donc les timers (ou laisse les timers mais empêche l'envoie des requêtes Ajax).


Sephi-Chan


RE: [AJAX] dans le cas où plusieures fenêtres du navigateur sont ouvertes - php_addict - 05-05-2010

ah oui...interessant...

tu le ferais toi si tu avait une requete SQL/AJAX toutes les 3 minutes ? je veut dire pour empecher l'AJAX si un mec ouvre 20 onglets?

merci Wink

PS: tiens, pourquoi tu préfère (utiliser un attribut personnalisé sur un élément du DOM (<body data-active-user="true">, par exemple)) ?


RE: [AJAX] dans le cas où plusieures fenêtres du navigateur sont ouvertes - Sephi-Chan - 05-05-2010

Oui je le ferais pour arrêter les requête inutiles, même si elles interrogent rarement.
J'afficherai une modal box (qui assombrit le reste de l'écran) avec un court message explicatif et un bouton pour repasser en mode actif.

Et je préfère utiliser des attributs dans le DOM car c'est bien plus propre que des variables globales, et ça permet souvent de stocker des informations qui permettent de faire des économies (des ressources du serveur comme du client) intelligemment. De plus, c'est facile d'y accéder, et donc pratique à utiliser. Smile


Sephi-Chan


RE: [AJAX] dans le cas où plusieures fenêtres du navigateur sont ouvertes - garf - 05-05-2010

(05-05-2010, 09:36 AM)php_addict a écrit : j'ai un script JS/AJAX qui fait une requete SQL au serveur toutes les 30 secondes (parametrable, ca pourra être 2 minutes...)

mais il est possible que les internautes laissent ouvert leur navigateur avec plusieurs onglets ouverts...si il y a 20 onglets ouvert, ca fait 20 requêtes simultanées. (rien dans mon mmorpg n'incite a ouvrir 20 onglets, mais on ne sais jamais, les gens font des trucs étranges parfois Smile )

Si tes requêtes se font en GET, cela ne posera pas trop de soucis de surcharge serveur (ou faible) car elles seront dans le cache du navigateur et au pire tes requêtes risquent d'utiliser le cache de ton serveur de base de donnée, donc je pense que c'est un faux problème. Au pire, tu peux rajouter un système de cache supplémentaire pour éviter des traitements inutiles.


RE: [AJAX] dans le cas où plusieures fenêtres du navigateur sont ouvertes - Anthor - 05-05-2010

@garf : Je pense que si il voulait le cache, il demanderait pas toutes les 30 secondes des informations au serveur ^^

@sephi : Je suis d'accord sur l'attribut, mais dans le cas présent il vaut mieux le mettre dans une balise META.

Code PHP :
<?php 
<meta name="data-active-user" content="true" />

Ça revient au même, j'en convient Smile


RE: [AJAX] dans le cas où plusieures fenêtres du navigateur sont ouvertes - Sephi-Chan - 05-05-2010

Je ne suis pas sûr que le serveur mette en cache les requêtes qui se différencient les unes des autres par la query string (la partie derrière le ? dans l'URL).

Oui ça revient au même, cela dit je ne sais pas si c'est mieux. Je vois plus la meta pour stocker des choses immuables. Smile

C'est-ce qu'on utilise dans Rails pour stocker l'authenticity token (pour automatiquement protéger des attaques CSRF) de manière globale, pour l'ajouter aux requêtes Ajax automatiquement. Smile


<meta name="csrf-token" content="<%= form_authenticity_token %>" />
<meta name="csrf-param" content="authenticity_token" />

C'est utilisé dans le fichier rails.js (celui-ci est pour Prototype).


Sephi-Chan


RE: [AJAX] dans le cas où plusieures fenêtres du navigateur sont ouvertes - garf - 05-05-2010

Sephi-Chan a écrit :Je ne suis pas sûr que le serveur mette en cache les requêtes qui se différencient les unes des autres par la query string (la partie derrière le ? dans l'URL).
le cache des requetes GET se fait au niveau du navigateur (donc le serveur n'est pas sollicité). La solution du cache serveur est une sécurité supplémentaire pour éviter une charge inutile du au traitement. (en gros, c'est les bretelles en plus de la ceinture ou l'inverse^^)

@Anthor : le cache peut avoir une durée de vie de 30sec (peut être jouable avec les header HTTP voire avec les meta HTML).

@Sephi : idée intéressante mais je ne pense pas que cela empêche les multiples appels avec plusieurs pages, le limite probablement. Ca m'arrive d'avoir X fenetres d'ouverte est de switcher entre elles toutes les Y sec, Y < 30 sec. C'est largement jouables avec X <= 6 fenetres.


RE: [AJAX] dans le cas où plusieures fenêtres du navigateur sont ouvertes - Sephi-Chan - 05-05-2010

(05-05-2010, 12:45 PM)garf a écrit :
Sephi-Chan a écrit :Je ne suis pas sûr que le serveur mette en cache les requêtes qui se différencient les unes des autres par la query string (la partie derrière le ? dans l'URL).
le cache des requetes GET se fait au niveau du navigateur (donc le serveur n'est pas sollicité). La solution du cache serveur est une sécurité supplémentaire pour éviter une charge inutile du au traitement. (en gros, c'est les bretelles en plus de la ceinture ou l'inverse^^)

Oui je parlais du cache serveur. Mais comme le dit Anthor, s'il refresh toutes les secondes, cacher ne l'intéresse sûrement pas. Smile

(05-05-2010, 12:45 PM)garf a écrit : @Sephi : idée intéressante mais je ne pense pas que cela empêche les multiples appels avec plusieurs pages, le limite probablement. Ca m'arrive d'avoir X fenetres d'ouverte est de switcher entre elles toutes les Y sec, Y < 30 sec. C'est largement jouables avec X <= 6 fenetres.

Mais ça ne doit pas être le cas de beaucoup de personnes.
Et au pire, une solution plus simple et radicale : limiter dans le temps le nombre de requêtes Ajax par un client. Si le mec est un chaud de l'actualisation, il finira par se faire basher.


Sephi-Chan


RE: [AJAX] dans le cas où plusieures fenêtres du navigateur sont ouvertes - Jabberwock - 05-05-2010

J'avais lu quelque part que le XMLHttpRequest ce limité à 2 requêtes par navigateur.
J'ai jamais vérifier c'est peut être n'importe quoi (sa date un peu aussi ^^")