2011-08-04 6 views
3

Je voudrais créer un tableau de bord en temps réel où, dès qu'il y a une mise à jour, le script pourrait interroger et pousser les mises à jour sur le tableau de bord. Quelqu'un peut-il dire quelle serait la meilleure façon de le faire. Est-ce que node.js va vous aider?Pousser les mises à jour du serveur

Répondre

3

Je regarderais ajax, c'est un système qui utilise javascript & css pour récupérer des informations d'un backend (php, asp.net, etc) tout en ne rechargeant pas la page entière. Ensuite, il y a ajax inversé, qui ouvre essentiellement une connexion au serveur, mais le serveur ne retournera rien tout en maintenant la connexion ouverte. Cela évite au client d'avoir à interroger le serveur (demande répétée au serveur) pour obtenir des informations qui réduisent les coûts de bande passante pour l'utilisateur et le serveur. Le client peut simplement ouvrir une connexion et le serveur peut envoyer des informations quand elles sont disponibles (réplique en transmettant des informations au client, même si le client a démarré la connexion).

Aussi, voici un article va plus au sujet indepth inverse ajax, et les différentes implémentations: http://gmapsdotnetcontrol.blogspot.com/2006/08/exploring-reverse-ajax-ajax.html (merci) jacob

Node.js est une implémentation côté serveur JavaScript (à ma connaissance). Ce n'est pas nécessaire, un back-end peut être écrit en php, asp.net, ou vraiment n'importe quoi. Bien que vous devriez lire Darkyen's answer, il soulève quelques grands points sur pourquoi node.js est un meilleur backend puis dire php pour ce type de travail. Ce que vous voudrez cependant est une bibliothèque pour faire l'ajax facile. J'utilise jquery, mais il y a beaucoup de bonnes bibliothèques à choisir, y compris le prototype, Mootools et YUI.

J'espère que cela vous aide.

+1

La technique dans le deuxième paragraphe est généralement appelée "Comet" ou "Long Polling". La recherche de plus d'informations en utilisant ces termes aidera. – Jacob

+0

Merci pour les heads up, j'ai trouvé un bon article sur les différents types, et mettre un lien dans – Ben

+0

@mazzzzz Node.js n'est pas seulement une implémentation côté serveur de javascript c'est en fait un langage de script de serveur basé sur les événements qui est écrit principalement sur C pour la vitesse, la fonctionnalité réelle de node.js est qu'il prend en charge des applications très très en temps réel Comet et LongPolling ont tous les deux des problèmes énormes comète augmente la charge du serveur rebelle, longue interrogation augmente les frais généraux nécessaires pour traiter l'information. Maintenant, node.js n'utilise les ressources que quand elles sont nécessaires au lieu d'une longue interrogation et d'une comète. En fait, cela fonctionne plus vite et consomme moins de ressources. donc je pense que le nœud est une meilleure solution – ShrekOverflow

5

Je pense que node.js va beaucoup aider et sera rapide. Je vous conseille de jeter un oeil à socket.io.

+0

Je lui ai dit la différence entre node et php :-) avec ma réponse biiiiig, probablement il pourrait l'obtenir (s'il le lit cependant) N'hésitez pas à éditer ma réponse monsieur si vous y trouvez des failles ou des mis-concepts – ShrekOverflow

7

Mise à jour Au 10/08/2013: Le point de la bibliothèque et le soutien manque de Node.js a surtout disparu enfait en raison de libs comme mean.io vous pouvez réellement vous procurer un et en cours d'exécution dans la matière ou heures.

Anush comme indiqué dans les deux réponses ci-dessus qui étaient vraiment informatives, vous avez 2 solutions pour le côté serveur.

1. Node.js Based 'Event based' server 
    2. PHP/ASP.net based polling/comet/forever script based server 

au meilleur de mes connaissances et expériences Node.js et Socket.io a une très grande upperhand en raison de la simplicité et il but du développement pour le Web en temps réel - applications , mais « Php est stable puissant "Voici donc quelques-uns des avantages et des inconvénients des deux cadres mentionnés ci-dessus.

PHP: Benifits:

  1. Stabilité

  2. Puissance

  3. facilité de programmation si vous êtes familier avec C++ comme back-end

  4. A hu ge bibliothèque en ligne pour le support (php.net)

mécanismes sur PHP pour RealTime API avec des inconvénients INCONVENIENTS

  1. En général, lorsque vous utilisez la méthode longue Polling votre serveur doit traiter n demandes de même utilisateur par seconde. cette requête contient 8 Ko de données de requête + cookies à envoyer au serveur pour récupérer des informations. Ce qui augmente les frais généraux du serveur, et vous pouvez également vouloir autoriser le client à chaque fois (pour une meilleure sécurité), donc une fonction d'autorisation sera appelée n fois ainsi que ce qui augmente réellement la charge du serveur. avec n plus bas, vous perdez votre temps réel épique. avec plus de n vous créez un million de requêtes avec 21 personnes en 4 heures. Lors de l'utilisation de Comet, vous devez conserver les requêtes ouvertes pendant un certain temps et interroger en permanence la base de données ou l'API de votre serveur pour rechercher les modifications dans votre tableau de bord. Ce qui bloque tout le script et augmente la charge du serveur de manière rebelle à cause du nombre de threads APACHE/IIS ouverts. (Comet s'appuie sur Keep Alive Server), Sa solution exceptionnelle si elle est utilisée avec un serveur puissant, en fonction de votre serveur faire un choix judicieux. Lorsque vous utilisez une requête ouverte en permanence par AJAX.

  2. Lorsque vous ouvrez une requête en continu et que vous la gardez ouverte à tout moment pour écouter le côté serveur, vous surchargez extrêmement le serveur comme dans le cas 2. Je ne recommanderais absolument pas ceci j'ai écrit une applet comme ceci sur http://chats.ws/ hésitez pas à voir le code source et à l'inspecter dans la console/firebug. mais le serveur plante quand il y a 8 personnes sur le client. (Il s'agit d'une solution de prise BSD 1-shot en PHP intégré), le problème ici est que vous serez lié à quelques centaines d'utilisateurs au maximum. C'est la meilleure solution sinon. Comme cela vous donne la "puissance" et la "stabilité" de php avec une facilité d'utilisation avec des sockets web. Pour le client, vous pouvez utiliser le libre distribué XMLsocket API. Mais de tels styles de socket sont mieux écrits sur Java ou C++ à la place.

PHP est un bon choix si vous avez besoin de pas très impressionnant de temps réel de api et son meilleur langage pour écrire des pages web dynamiques mais quand il vient d'écrire un peu plus rapide des applications PHP retombe car il bloque le serveur et mange plus de ressources.

Maintenant vient la deuxième solution.

Node.js Node est un logiciel de serveur basé sur des événements qui signifie qu'il agit uniquement lorsqu'un événement se passe dire par exemple quand Apache ou PHP commence ils viennent et disent le système d'exploitation hôte qu'ils vont gérer les requêtes sur un port spécifique disent le port 80 maintenant ils restent continuellement dans la mémoire et mangent des ressources même lorsqu'elles ne sont pas utilisées. Comme dans comet/Forever Open Connections le sondage interne pour récupérer les données de la base de données garde un thread APACHE ouvert pour toujours manger vos ressources, mais dans le cas de Node, l'application démarre node.js entre en action et indique au système d'exploitation de le faire savoir une requête est faite sur un port spécifique puis il se met en veille (ie ne fait rien et laisse le système d'exploitation pour le gérer) quand une requête arrive node.js termine la requête et se met en veille ce qui signifie que ça marche quand c'est nécessaire Dans d'autres cas, la mémoire reste libre et les ressources telles que l'utilisation du processeur sont faibles. Node.js est assez nouveau et assez instable parfois mais si écrit joliment, il améliore les performances de votre application étonnamment. Il a un bon support et vous voudrez peut-être visiter le chatroom javascript sur chat.stackoverflow.com pour obtenir de l'aide parmi node.js avec socket.io comme backend.

Quelle socket.io fait est qu'il permet au programmeur d'écrire que son/sa demande et non pas les choses de base nécessaires à la communication, il gère automatiquement les méthodes de transport dans l'ordre

  1. Web Socket
  2. flash Socket.
  3. jsonp Polling
  4. XHR RELEVE

ce faisant, il veille à ce que votre programme fonctionne avec la même vitesse et de qualité sur tous les navigateurs web et Node.js comme le serveur. Lorsque vous apprendrez node.js, vous comprendrez à quel point il est facile d'écrire des choses qui étaient extrêmement dures sur PHP. par exemple dire sur php ouvrir toujours le code pour envoyer l'utilisateur les données lorsque availibe la base de données (disons mysql pour l'instant)

<?php 
    ob_implicit_flush(true); 
    set_timeout(0); 
    $T = 0; // for the first run send all the events 
    while(true){ 
    $query = mysql_query("select * from database where TimeStamp > ".$T); 
    if(mysql_num_rows(query)>0){ // That is omg we have an updated thing 
    $T = microtime(true); // this gives the variable the value of current time stamp 
     while ($row = mysql_fetch_assoc($query)) 
     { $result = process($row) // say u have to do some processing on the row 
      echo json_encode($result); // this will send the JSON formation to your client  for faster processing 
     } 
    } 
    } 
?> 

Maintenant, vous aurez également besoin de quelque chose pour gérer l'entrée de la base de données et ainsi de suite si 1 fichier plus au format .php pour prendre l'entrée.

Au lieu de cela, le code écrit avec Node.js socket.io ressemblera

// Assume all functions are declared. 

    var io = require("socket.io").listen(82); 
    io.sockets.on('connection',function(client){ 
    client.on('authorise',function(info){ 
    var signin = Authorise(info); // say the info packet contains information about client user pwd and the Authorise function checks for the data to be true or false and then acts accordingly returns a bool status which is true on success with autorisation_id(a member variablE)for the client and false on failure with the reason on failure in the reason member variable inside the signin object. 


    socket.emit('authorised',signin); 

    }); 


    client.on('request',function(data){ 
     var result = process(data); 
     client.emit('reply',result); // yes you can also send straight javascript objects 
    }); 
    client.on('some_other_event', function(ev){ // SOmething happend such as some long task completed or some other client send a message that can be sent this way. 
     client.emit('event',ev); 
    }); 
    . 
    . 
    // and so on 
    }); 

On client side a 

    <script src="server:82/socket.io/socket.io.js"></scirpt> 
    <script> 
    var connection = io.connect("server:82"); 
    connection.on('event',function(data){ 
     Process_Event(data); // some function which processes event data 
     }); 
    connection.on('authorised',function(data){ 
     Auth(data); // Some function which tells client hey you are authroised or not and why not 
     }); 
    connection.on('reply',function(data){ 
    parse_reply(data); // some function that tells the client what is the reply of the request by server and what it has to do 
    }); 
    function Authorise(){ // Lets assume its called by some html event 
     username = document.getElementById('username').value; 
     password = document.getElementById('password').value; 
     socket.emit('authorise',{usr:username,pass:password}); // sends the request to server  
     } 
     function Request(req) {} // this is a function which is called by some script gives it the request as the parameter when calling 
     { 
     socket.emit('request',req); // sends request to server 
     } 
    </script> 

Si vous n'êtes pas déjà noté il n'y a pas pour/while (true) dans ce dernier et donc il ne marche pas bloque le serveur de quelque façon que ce soit l'utilisation de base de node.js avec socket.io sur Socket Polling, Comet, ou BSD.

Maintenant le choix est à vous! Choisissez sage :) comme votre application en dépend, n'hésitez pas à demander plus de doutes sur chat.stackoverflow.com ou sur ici :)

+0

Very bien mis ensemble, vous faites un bon point. Quand j'ai dit qu'il n'avait pas besoin de node.js, je voulais dire exactement cela, il n'en avait pas besoin, cela fait un bon exemple de pourquoi il le voudrait bien.Oh, et vous avez mal étiqueté un tag de fin de script (ça me dérangeait un peu). – Ben

+0

Et j'espère que vous ne me dérange pas de me lier à votre réponse de la mienne – Ben

+1

pas de problème .. je l'ai fait un wiki de la communauté;) afin que vous puissiez éditer et donner vos entrées aussi – ShrekOverflow

Questions connexes