web-dev-qa-db-fra.com

Que sont les interrogations longues, Websockets, les événements envoyés par le serveur (SSE) et Comet?

J'ai essayé de lire certains articles, mais je ne suis pas encore très clair sur les concepts.

Quelqu'un voudrait-il tenter de m'expliquer en quoi consistent ces technologies:

  1. Long scrutin
  2. Événements envoyés par le serveur
  3. Websockets
  4. Comète

Une chose que je rencontrais à chaque fois était que le serveur maintenait une connexion ouverte et transmettait des données au client. Comment la connexion est-elle maintenue ouverte et comment le client obtient-il les données transmises? (Comment le client utilise-t-il les données, peut-être qu'un code pourrait aider?)

Maintenant, lequel d’entre eux devrais-je utiliser pour une application en temps réel? J'ai beaucoup entendu parler de websockets (avec socket.io [une bibliothèque de noeuds.js]), mais pourquoi pas PHP?

977
user1437328

Dans les exemples ci-dessous, le client est le navigateur et le serveur est le serveur Web hébergeant le site Web.

Avant de pouvoir comprendre ces technologies, vous devez d'abord comprendre le trafic Web classique .

HTTP régulier:

  1. Un client demande une page Web à un serveur.
  2. Le serveur calcule la réponse
  3. Le serveur envoie la réponse au client.

HTTP

Ajax Polling:

  1. Un client demande une page Web à un serveur en utilisant HTTP standard (voir HTTP ci-dessus).
  2. Le client reçoit la page Web demandée et exécute le code JavaScript sur la page qui demande un fichier au serveur à intervalles réguliers (par exemple, 0,5 seconde).
  3. Le serveur calcule chaque réponse et la renvoie, exactement comme le trafic HTTP normal.

Ajax Polling

Ajax Long-Polling:

  1. Un client demande une page Web à un serveur en utilisant HTTP standard (voir HTTP ci-dessus).
  2. Le client reçoit la page Web demandée et exécute le code JavaScript sur la page qui demande un fichier au serveur.
  3. Le serveur ne répond pas immédiatement avec les informations demandées mais attend jusqu'à ce que de nouvelles informations soient disponibles.
  4. Lorsque de nouvelles informations sont disponibles, le serveur répond avec les nouvelles informations.
  5. Le client reçoit les nouvelles informations et envoie immédiatement une autre demande au serveur, ce qui relance le processus.

Ajax Long-Polling

SSE (HTML5 Server Sent Events)/EventSource:

  1. Un client demande une page Web à un serveur en utilisant HTTP standard (voir HTTP ci-dessus).
  2. Le client reçoit la page Web demandée et exécute le code JavaScript sur la page, ce qui ouvre une connexion au serveur.
  3. Le serveur envoie un événement au client lorsque de nouvelles informations sont disponibles.

    • Le trafic en temps réel du serveur au client, c'est principalement ce dont vous aurez besoin
    • Vous voudrez utiliser un serveur qui a une boucle d'événement
    • Les connexions avec des serveurs d'autres domaines ne sont possibles que avec les paramètres CORS corrects
    • Si vous voulez en savoir plus, j'ai trouvé cela très utile: (article) , (article) , (article) , (tutoriel) .

HTML5 SSE

HTML5 Websockets:

  1. Un client demande une page Web à un serveur en utilisant http standard (voir HTTP ci-dessus).
  2. Le client reçoit la page Web demandée et exécute le code JavaScript sur la page, ce qui ouvre une connexion avec le serveur.
  3. Le serveur et le client peuvent désormais s'échanger des messages lorsque de nouvelles données (de chaque côté) sont disponibles.

    • Trafic en temps réel du serveur vers le client et du client vers le serveur
    • Vous voudrez utiliser un serveur qui a une boucle d'événement
    • Avec WebSockets, il est possible de se connecter à un serveur d'un autre domaine.
    • Il est également possible d'utiliser un serveur Websocket hébergé tiers, par exemple pousseur ou autres . De cette façon, vous ne devrez implémenter que le côté client, ce qui est très facile!
    • Si vous voulez lire plus, j'ai trouvé ces très utiles: ( article ), (article) ( tutoriel ).

HTML5 WebSockets

Comète:

Comet est un ensemble de techniques antérieures à HTML5 qui utilisaient la diffusion en continu et les longues interrogations pour réaliser des applications en temps réel. En savoir plus sur l'article wikipedia ou this .


Maintenant, lequel d’entre eux devrais-je utiliser pour une application en temps réel (que je dois coder)? J'ai beaucoup entendu parler de websockets (avec socket.io [une bibliothèque node.js]) mais pourquoi pas PHP?

Vous pouvez utiliser PHP avec WebSockets, consultez Ratchet .

2001
Tieme

Tieme a beaucoup travaillé sur son excellente réponse, mais je pense que le cœur de la question des PO est de savoir comment ces technologies se rapportent à PHP plutôt qu'à la manière dont chaque technologie fonctionne.

PHP est le langage le plus utilisé dans le développement Web, en plus du langage client évident, html, css et javascript. Pourtant, PHP a deux problèmes majeurs en ce qui concerne les applications en temps réel:

1) PHP a commencé comme un CGI très basique. PHP a beaucoup progressé depuis ses débuts, mais cela s'est fait par petites étapes. PHP comptait déjà plusieurs millions d'utilisateurs au moment où il est devenu la bibliothèque C intégrée et flexible qu'il est aujourd'hui, dont la plupart dépendaient de son modèle d'exécution précédent, ce qui n'a donc pas encore été fait. une tentative solide d'échapper au modèle cgi en interne. Même l'interface de ligne de commande appelle la bibliothèque PHP (libphp5.so sur linux, php5ts.dll sur Windows, etc.) comme s'il s'agissait toujours d'un cgi traitant une demande GET/POST. Il exécute toujours le code comme s'il suffisait de créer une "page" puis de terminer son cycle de vie. De ce fait, la programmation multi-thread ou événementielle (au sein de PHP espaces-utilisateur) est très peu prise en charge, ce qui la rend actuellement peu pratique pour les applications multi-utilisateurs en temps réel.

Notez que PHP possède des extensions pour fournir des boucles d'événement (telles que libevent) et des threads (tels que pthreads) dans PHP espace utilisateur, mais très très peu d'applications les utilisent.

2) PHP a toujours des problèmes importants avec le garbage collection. Bien que ces problèmes se soient constamment améliorés (ce qui est probablement le plus grand pas en fin de cycle de vie décrit ci-dessus), même les meilleures tentatives pour créer des applications longues PHP nécessitent d'être redémarrées régulièrement. Cela le rend également peu pratique pour les applications en temps réel.

PHP 7 sera également une excellente étape pour résoudre ces problèmes, et semble très prometteur en tant que plate-forme pour applications en temps réel.

36
JSON

J'ai essayé de prendre des notes à ce sujet et de rassembler et d'écrire des exemples d'un point de vue Java .

HTTP pour Java Developers

Reverse Ajax - Style ancien

Gestion asynchrone côté serveur

Reverse Ajax - Nouveau style

Événements envoyés par le serveur

Le mettre ici pour tout développeur Java qui s'intéresse au même sujet.

9
John

Vous pouvez facilement utiliser Node.JS dans votre application Web uniquement pour la communication en temps réel. Node.JS est vraiment puissant lorsqu'il s'agit de WebSockets. Par conséquent, "Notifications PHP via Node.js" serait un excellent concept.

Voir cet exemple: Création d'une application de discussion en temps réel avec PHP et Node.js

0
Supun Kavinda