Existe-t-il une alternative à ajax qui ne nécessite pas d'interrogation sans modification côté serveur?

StackOverflow https://stackoverflow.com/questions/427861

  •  06-07-2019
  •  | 
  •  

Question

J'essaie de créer un petit et basique " ajax " jeu multijoueur basé. Les coordonnées des objets sont données par un & Quot; gestionnaire & Quot; PHP. Ce fichier handler.php est interrogé tous les 200 ms à l’aide de ajax.

Puisqu'il n'est pas nécessaire de procéder à un sondage lorsque rien ne se produit, je me demande s'il y a quelque chose qui pourrait faire la même chose sans sondage fréquent. Par exemple. Comet, même si j’ai entendu dire que vous deviez configurer des applications côté serveur pour Comet. C'est un serveur Web partagé, je ne peux donc pas le faire.

Peut-être empêcher le fichier handler.php de même renvoyer une réponse si rien ne doit être modifié chez le client, est-ce possible? Là encore, le client demanderait toujours inutilement une réponse même si quelque chose n’avait pas encore changé. Fondamentalement, il ne devrait utiliser de la bande passante et couper des ressources que si quelque chose doit être dit au client, par exemple. le changement des coordonnées d'un objet.

Était-ce utile?

La solution

Voici une solution: utilisez un fournisseur de comète SaaS, tel que WebSync On-Demand . Aucune ressource serveur à prendre en compte, hébergement partagé ou non, car tout est déchargé et vous pouvez diffuser les informations en fonction des besoins.

Puisqu'il s'agit de SaaS, il fonctionnera avec n'importe quelle langue de serveur. Pour PHP, il existe déjà un éditeur écrit et prêt à l'emploi.

Autres conseils

Comet est généralement utilisé pour ce genre de choses, et il peut s'agir d'une configuration fragile, car il ne s'agit pas d'une technologie particulièrement répandue. Il est donc facile de ne pas & "bien faire les choses. &"; Cela dit, il y a plus de ressources disponibles maintenant que lors de ma dernière tentative, il y a environ 2 ans.

Je ne pense pas que vous puissiez faire ce que vous pensez et que handler.php ne renvoie rien et arrête l'exécution: le serveur Web gardera la connexion ouverte et empêchera toute interrogation ultérieure jusqu'à ce que handler.php fasse quelque chose (se termine ou fournit une sortie). Dans ce cas, vous gérez toujours une réponse.

Vous pouvez essayer une technique d'interrogation longue, dans laquelle votre AJAX autorise un très long délai d'attente (par exemple, 30 secondes), et handler.php tourne sans répondre jusqu'à ce qu'il ait quelque chose à signaler, puis revient. (Vous voudrez vous assurer que la filature ne nécessite pas beaucoup de ressources). Si handler.php & Quot; expire & Quot; et rien ne se passe, laissez-le quitter et laissez AJAX interroger à nouveau. Comme cela ne se produit que toutes les 30 secondes, ce sera une amélioration considérable, environ 5 fois par seconde. Cela garderait votre scrutin au minimum.

Mais c'est le genre de chose pour laquelle Comet est conçu.

Etant donné qu'Ajax ne vous propose qu'un modèle de requête client / serveur (généralement appelé "pull" plutôt que "push"), le seul moyen d'obtenir des données du serveur consiste à utiliser des requêtes. Cependant, une technique courante pour éviter ce problème est que le serveur ne réponde que lorsqu'il dispose de nouvelles données. Donc, le client fait une demande, le serveur s'accroche à cette demande jusqu'à ce que quelque chose se passe, puis répond. Cela évite la nécessité d'interrogations fréquentes, même lorsque les données ne sont pas modifiées, il suffit que le client envoie une nouvelle demande après avoir reçu une réponse.

Puisque vous utilisez PHP, une méthode simple pourrait consister à demander au code PHP d'appeler la commande sleep pendant 200 ms à la fois entre les vérifications des modifications de données, puis de renvoyer les données au client, le cas échéant.

EDIT: Je recommanderais également un délai d’attente pour la demande. Donc, si rien ne se passe pendant 2 secondes, un & "Pas de changement &"; le message est renvoyé. Ainsi, le client sait que le serveur est toujours actif et traite sa demande.

Puisque ceci est étiqueté & # 8220; html5 & # 8221 ;: HTML5 a <eventsource> et WebSocket , mais la mise en oeuvre est toujours au futur dans la pratique.

Opera a implémenté une ancienne version de <event-source> appelée <=>.

Le serveur doit y participer. Vérifiez auprès de votre hébergeur quels modules sont disponibles. Ou essayez de les convaincre de soutenir Comet.

Vous devriez peut-être envisager un petit serveur privé virtuel (VPS) pour cela.

Une chose à ajouter aux suggestions d'interrogation longue: si vous êtes sur un serveur partagé, cette solution aura une évolutivité limitée, car chaque interrogation longue active conservera une connexion (et un processus côté serveur pour la gérer). actif. Votre fournisseur a probablement des limites (définies par la politique ou de facto) sur le nombre de connexions que vous pouvez avoir ouvertes à la fois. Vous allez donc vous heurter à un mur si vous avez plus de sessions / fenêtres que celles jouées simultanément.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top