7
votes

Meilleure approche pour la diffusion de données en temps réel (plate-forme inter-plateforme) dans PHP?

Je me demandais comment faire "True" (Semi) Données en temps réel en streaming avec PHP.

Applications possibles: salles de discussion, ventes aux enchères, jeux, etc.

Par "True", je veux dire que les données ne sont pas simplement écrites quelque part et interrogées en permanence, mais en train de diffuser au client d'une manière ou d'une autre.

par "semi", je veux dire que c'est bien si seul le flux du serveur au client est en temps réel et que des messages du client sur le serveur ne sont pas.

Pour la communication entre le client et le serveur, j'aimerais coller avec un fichier http [Ajax) plutôt que d'un autre protocole.

Streaming sur le client avec HTTP est possible en rinçant manuellement le tampon de sortie.

La question est de savoir ce qu'il faut connecter ce script sur le côté serveur?

Et une fois qu'il est connecté, faire une lecture de blocage, plutôt que de voter pour les changements.

L'extension de la mémoire partagée (shmop) fonctionnerait, mais ce n'est pas une plate-forme inter-plate-forme.

Peut-être que Memcached fonctionnerait? Mais je ne suis pas sûr de savoir s'il y a un moyen de faire une lecture, de sorte que cela revient à voter à nouveau - bien que je suis sûr que Memcached est assez rapide, je n'aime tout simplement pas l'idée d'interrogation continue.

Des idées?


1 commentaires

Je ne veux pas dire pousser - je cherche un moyen d'ouvrir un flux / tuyau / port / canal / quelque chose sur le côté serveur et écrivez-y, et tout autre script actuellement connecté à ce flux / chose peut lire à partir de ce dernier. Il en mode blocage, puis écrivez des résultats à une requête HTTP en cours d'exécution en continu.


3 Réponses :


2
votes

Si vous utilisez HTML et JavaScript, vous voulez que WebSockets. Si c'est flash ou quoi que ce soit d'autre, les prises TCP normales normales.

L'idée est que vous exécutez un fichier de serveur (écrit en PHP), qui attend les connexions. Une fois qu'il est connecté à un ou plusieurs clients, les données peuvent être poussées à la fois. Il y a quelques projets de bande Web PHP là-bas. Consultez ceci:

http://code.google.com/p/phpwebsocket

Il y a aussi un cadre appelé squelette que j'ai contribué à cela possède une bibliothèque de serveurs Websocket intégrée. toujours dans les étapes instables, cependant.

http://code.google.com/p/skeleton

Malheureusement, les webockets sont toujours une nouvelle technologie, elles ne sont donc pas prises en charge universellement. Comme @christian mentionné, vous pouvez utiliser la bibliothèque Socket.io.


2 commentaires

J'ai récemment rencontré Ratchet - une très belle implémentation simple, propre et simple d'un serveur de sockets Web dans PHP .


Je pense que le dos - Ratchet est une bonne idée, mais PHP en tant que telle n'est pas adapté aux applications en temps réel en tant que serveur de socket - Cet article explique pourquoi.



0
votes

Si vous souhaitez communiquer entre PHP et une autre langue (par exemple une application C ++), vous pouvez regarder dans Apache Thrift ( http://thrift.apache.org/ ). Apache Thrift est largement utilisé sur Facebook pour "Développement des services transfrontaliers".

EDIT: J'utiliserais probablement l'épargne Apache pour communiquer avec un application torsadée écoute de l'application sur le port 80 et avons le Les navigateurs se connectent à l'application tordue à l'aide d'un interrogatoire long ou d'une bande Websocket. Vous voudrez peut-être aussi regarder socket.io , c'est une mise en œuvre de socket Web croiseur qui est faite pour les applications en temps réel.

Fondamentalement, vous auriez que votre application appuie votre serveur Web torsadé à l'aide de l'épargne et vous passeriez ensuite le message à toutes les connexions ouvertes.

  • Christian

1 commentaires

Je ne suis pas convaincu que cela vaut la peine d'effort - PHP n'a tout simplement pas été conçu pour ce type de tâche. Il a été conçu avec le cycle de vie HTTP à l'esprit: un modèle de demande / réponse apatride. NODEJS est un pari beaucoup plus sûr pour les applications en temps réel / socket, et la barrière de la langue n'est pas si mauvaise maintenant, avec toutes les grandes langues compilées pour JavaScript et utilisez simplement le nœud / V8 en tant que VM.



4
votes

PHP n'est pas bien adapté à la mise en œuvre de la diffusion de données en temps réel. PHP est très lent et n'est pas conçu pour construire des applications multi-threadées. Vous feriez mieux de mettre en œuvre un serveur de prise gonflé complet dans une langue comme Python ou Java.

Cela dit, je recommande vivement de vérifier Nodejs: http://nodejs.org/

Il utilise un modèle basé sur des événements asynchrones pour les E / S, au lieu d'avoir un bloc de threads dans une boucle d'événement. Les serveurs Nodejs sont écrits en JavaScript. Nodejs est rapide, échelle et a une courbe d'apprentissage basse.

Les clients se connecteraient à un serveur HTTP NODEJS à l'aide de demandes d'ajax à interrogation longues. PHP pourrait se connecter à Nodejs directement et appuyer sur les notifications. Ou PHP pourrait écrire sur une file d'attente de message ou une base de données, Memcache, etc. et Nodejs interrogeraient ces magasins de données pour les mises à jour et envoyer de nouveaux messages aux clients.

Vous auriez peut-être besoin d'écrire votre propre démon pour servir de navigation entre Nodejs à MySQL, Memcached, etc. Lors de l'interrogation pour les mises à jour. Nodejs garderait une prise ouverte avec un processus de démon. Le processus Daemon interrogerait les magasins de données pour les mises à jour et envoie les mises à jour de NodeJS. Un serveur HTTP NODEJS envoiait ensuite ces mises à jour des clients.

Voir ce didacticiel pour la mise en œuvre d'un flux Twitter en temps réel: http://net.tutsplus.com/ Tutoriels / JavaScript-Ajax / Apprendre-Serverside-Javascript-avec-Node-JS /


6 commentaires

c'est exactement ce que nœud.js est pour


Vous avez mal à propos de PHP étant lent. Mais je suis d'accord, il n'a probablement pas été conçu pour des applications parallèles / multi-filetées de ce type. Réponse acceptée.


Nodejs n'est pas un seul filetage rickgaribay.net/archive / 2012/01/28 / ...


+1 sur le "faux sur PHP étant lent". Ce n'est pas. Il dispose de limitations autour de la filetage et il n'est définitivement pas adapté aux connexions persistantes, mais ce n'est pas lent.


Regardez la date de la poste. PHP est certainement plus lent que Java, Python et JS en V8. Et était encore plus de retour en 2011.


La réponse est dangereusement obsolète. PHP 5-> 7 est arrivé avec un énorme boost de performance et 7-> 8 est venu avec une autre augmentation et un compilateur JIT (qui nécessite une utilisation appropriée de frappe). PHP 8 est 3-4 fois plus rapide que Python typiquement, lorsqu'il est optimisé pour la performance, probablement un peu plus que cela. Dans de nombreuses tâches, Java est notable plus rapide que PHP aujourd'hui, bien que le nouveau compilateur JIT puisse fermer l'écart. En termes de mémoire, PHP est beaucoup plus efficace que Java. PHP peut être utilisé comme langage de haut niveau de haute performance, y compris multi-threading et non bloquant IO.