Utiliser PHP avec Socket.io

128

Est-il possible d'utiliser Sockets.io côté client et de communiquer avec une application PHP sur le serveur? PHP supporte-t-il même une telle manière d'écrire du code avec une connexion de longue durée?

Tout l'exemple de code que je trouve pour socket.io semble être pour node.js côté serveur, donc aucune aide là-bas.

Yuvi
la source
3
Double
hakre
Vous voudrez peut-être envisager de simplement pousser. Il a une bibliothèque PHP astucieuse que je vais utiliser.
Devin G Rhode
salut, essayez celui-ci - github.com/walkor/phpsocket.io
Zhenya Hristova

Réponses:

98

Il est peut-être un peu tard pour répondre à cette question, mais voici ce que j'ai trouvé.

Je ne veux pas débattre sur le fait que les nœuds le font mieux que php ou pas, ce n'est pas le point.

La solution est: je n'ai trouvé aucune implémentation de socket.io pour PHP.

Mais il existe des moyens d'implémenter WebSockets . Il existe ce plugin jQuery vous permettant d'utiliser Websockets tout en dégradant gracieusement pour les navigateurs non compatibles. Du côté PHP, il y a cette classe qui semble être la plus utilisée pour les serveurs PHP WS.

Florian Margaine
la source
1
la classe phpwebsocket est en effet la voie à suivre si vous voulez une implémentation de serveur php websocket. Cependant, cela n'est pas lié à la question. L'OP a déjà implémenté un serveur WS (socket.io) et a demandé des moyens de communiquer avec une application php.
kasper Taeymans
72

Si vous souhaitez utiliser socket.io avec php, cela peut être votre réponse!

site Web du projet:

elephant.io

ils sont également sur github:

https://github.com/wisembly/elephant.io

Elephant.io fournit un client socket.io entièrement écrit en PHP qui devrait être utilisable partout dans votre projet.

C'est une bibliothèque légère et facile à utiliser qui vise à apporter des fonctionnalités en temps réel à une application PHP via socket.io et websockets pour des actions qui ne pourraient pas être effectuées en javascript complet.

exemple du site Web du projet (communiquer avec le serveur websocket via php)

serveur php

use ElephantIO\Client as Elephant;

$elephant = new Elephant('http://localhost:8000', 'socket.io', 1, false, true, true);

$elephant->init();
$elephant->send(
    ElephantIOClient::TYPE_EVENT,
    null,
    null,
    json_encode(array('name' => 'foo', 'args' => 'bar'))
);
$elephant->close();

echo 'tryin to send `bar` to the event `foo`';

serveur socket io

var io = require('socket.io').listen(8000);

io.sockets.on('connection', function (socket) {
  console.log('user connected!');

  socket.on('foo', function (data) {
    console.log('here we are in action event and data is: ' + data);
  });
});
Kasper Taeymans
la source
2
Je vais vous donner un +1 ici, mais il semble que ce soit encore un petit moyen d'être utilisable dans un environnement de production.
Beachhouse
17
J'ai vu celui-ci, mais une chose m'a confondu. N'est-ce pas le but ici de faire implémenter par PHP un serveur sockets.io? et, à la place, Elepant.io semble être une implémentation PHP d'un client sockets.io pour lequel vous pouvez vous connecter à un autre serveur sockets.io (ce qui signifie que elephant.io n'écoute pas les connexions de vos clients sockets.io, se connectant à eux et les entretenir)?
Pimp Trizkit
Juste ce que je suis venu chercher, dommage que la connexion persistante soit à un stade précoce de développement.
slezadav
8
Salut à tous. Le but d'Elephant.io est simplement de déclencher des événements de PHP vers un serveur socket.io. Ne pas ouvrir une connexion persistante. Mais pour pouvoir se connecter rapidement et envoyer des événements / messages. Nous l'utilisons en production et cela fonctionne comme un charme.
guillaumepotier
3
cette bibliothèque n'est plus maintenue et a quelques problèmes pour nous
Flion
14

Si vous voulez vraiment utiliser PHP comme backend pour socket.io, voici ce que j'ai trouvé. Deux alternatives côté serveur php socket.io.

https://github.com/walkor/phpsocket.io

https://github.com/RickySu/phpsocket.io

Exemples de codes pour le premier référentiel comme celui-ci.

use PHPSocketIO\SocketIO;

// listen port 2021 for socket.io client
$io = new SocketIO(2021);
$io->on('connection', function($socket)use($io){
  $socket->on('chat message', function($msg)use($io){
    $io->emit('chat message', $msg);
  });
});
marcheur
la source
7

Pour la «connexion longue durée» que vous avez mentionnée, vous pouvez utiliser Ratchet pour PHP. C'est une bibliothèque construite à partir des fonctions Stream Socket que PHP prend en charge depuis PHP 5.

Pour le côté client, vous devez utiliser WebSocket pris en charge par HTML5 au lieu de Socket.io (puisque vous le savez, socket.io ne fonctionne qu'avec node.js).

Si vous souhaitez toujours utiliser Socket.io, vous pouvez essayer de cette manière: - trouver et obtenir socket.io.js pour le client à utiliser - travailler avec Ratchet pour simuler la façon dont socket.io le fait sur le serveur

J'espère que cela t'aides!

Chung Xa
la source
6

Euh, pourquoi le voudriez-vous? Laissez PHP sur le backend et NodeJS / Sockets pour faire son travail non bloquant.

Voici quelque chose pour vous aider à démarrer: http://groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc

Personnellement, j'ai express en cours d'exécution avec un point de terminaison qui écoute expressément l'interaction de PHP.

Par exemple, si j'ai envoyé un e-mail à un utilisateur, je souhaite que socket.io affiche une notification en temps réel à l'utilisateur.

Vous voulez une interaction de socket.io vers php, eh bien, vous pouvez simplement faire quelque chose comme ceci:

var http = require('http'),
            host = WWW_HOST,
            clen = 'userid=' + userid,
            site = http.createClient(80, host),
            request = site.request("POST", "/modules/nodeim/includes/signonuser.inc.php",  
                {'host':host,'Content-Length':clen.length,'Content-Type':'application/x-www-form-urlencoded'});                     

request.write('userid=' + userid);      
request.end();  

Sérieusement, PHP est idéal pour faire des choses côté serveur et le laisser avec les connexions, il n'a plus sa place dans ce domaine maintenant. Pourquoi faire quelque chose de long interrogation lorsque vous avez des websockets ou des flashsockets.

PaulM
la source
32
Parce que certains d'entre nous ne peuvent obtenir qu'un hôte bon marché qui ne vous permettra d'utiliser que php et mysql.
Lanbo
31
Parce que certains d'entre nous doivent travailler avec des frameworks existants qui dépendent de PHP. Par exemple, nous développons et vendons un script PHP, mais nous aimerions améliorer la messagerie instantanée en utilisant des websockets, nous ne voulons pas écrire tous les fallbacks que socket.io a déjà implémentés mais nous ne pouvons pas exiger NodeJS de nos clients.
Purefan
3
@PaulM: J'ai essayé quelques fournisseurs de VPS <10 $, et tous sont vraiment nuls. Chacun était très lent, quand quelque chose est cassé, le support est horrible etc. D'un autre côté, en Finlande, il n'est pas rare d'obtenir un hébergement Web de qualité décente (mais avec php / mysql / fichiers statiques uniquement) avec un abonnement adsl, sans payer de supplément . Donc non, pouvoir acheter des VPS de merde pour 5 $ n'est certainement pas une solution.
Olli
4
Pour <10 $ fournisseurs de VPS, le seul bon que j'ai trouvé jusqu'à présent est digitalocean.com. Mais celui-là est plutôt bon.
Aeolun
3
Je ne suis pas d'accord. Je pense qu'une réponse comme celle-ci est très pertinente. Quelqu'un vous disant "vous l'utilisez mal" pourrait valoir beaucoup plus que quelqu'un vous aidant à l'utiliser mal.
Rijk
6

Je connais l'homme de lutte! Mais j'ai récemment travaillé avec Workerman. Si vous n'êtes pas tombé sur ce framework php, vous feriez mieux de le vérifier!

Eh bien, Workerman est un framework PHP asynchrone piloté par les événements pour créer facilement des applications réseau rapides et évolutives. (Je viens de copier et coller cela à partir de leur site Web hahahah http://www.workerman.net/en/ )

La façon simple d'expliquer cela est que lorsqu'il s'agit de programmation de socket Web, tout ce dont vous avez vraiment besoin est d'avoir 2 fichiers sur votre serveur ou serveur local (où que vous soyez).

  1. server.php (code source qui répondra à toutes les demandes du client)

  2. client.php / client.html (code source qui fera les choses demandées)

Donc, fondamentalement, vous corrigez d' abord le code sur votre serveur.php et démarrez le serveur. Normalement, comme j'utilise Windows, ce qui ajoute plus de difficulté, je lance le serveur via cette commande -> php server.php start

Eh bien, si vous utilisez xampp. Voici une façon de le faire. Accédez à l'endroit où vous souhaitez placer vos fichiers. Dans notre cas, nous allons mettre les fichiers dans

C: /xampp/htdocs/websocket/server.php

C: /xampp/htdocs/websocket/client.php ou client.html

En supposant que vous avez déjà ces fichiers sur votre serveur local. Ouvrez votre Git Bash ou votre ligne de commande ou votre terminal ou celui que vous utilisez et téléchargez les bibliothèques php ici.

https://github.com/walkor/Workerman

https://github.com/walkor/phpsocket.io

Je le télécharge généralement via composer et je charge simplement ces fichiers dans mes scripts php.

Et vérifiez également celui-ci. C'est vraiment important ! Vous avez besoin de cette bibliothèque javascript pour que client.php ou client.html puisse communiquer avec le server.php lorsque vous l'exécutez.

https://github.com/walkor/phpsocket.io/tree/master/examples/chat/public/socket.io-client

Je viens de copier et coller ce dossier socket.io-client au même niveau que mon serveur.php et mon client.php

Voici le code source server.php

<?php
require __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;
use PHPSocketIO\SocketIO;

// listen port 2021 for socket.io client
$io = new SocketIO(2021);
$io->on('connection', function($socket)use($io){
    $socket->on('send message', function($msg)use($io){
        $io->emit('new message', $msg);
    });
});

Worker::runAll();

Et voici le code source client.php ou client.html

<!DOCTYPE html>
<html>
    <head>
        <title>Chat</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">        
    </head>
    <body>
        <div id="chat-messages" style="overflow-y: scroll; height: 100px; "></div>        
        <input type="text" class="message">
    </body>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>    
    <script src="socket.io-client/socket.io.js"></script>  
    <script>
            var socket = io.connect("ws://127.0.0.1:2021");

            $('.message').on('change', function(){
                socket.emit('send message', $(this).val());
                $(this).val('');
            });

            socket.on('new message', function(data){
                $('#chat-messages').append('<p>' + data +'</p>');
            });
    </script>
</html>

Encore une fois, ouvrez votre ligne de commande ou git bash ou terminal où vous avez placé votre fichier server.php. Donc, dans notre cas, c'est C: / xampp / htdocs / websocket / et tapé dans php server.php start et appuyez sur Entrée.

Ensuite, allez dans votre navigateur et tapez http: //localhost/websocket/client.php pour visiter votre site. Ensuite, tapez simplement n'importe quoi dans cette zone de texte et vous verrez un websocket php de base en déplacement!

Vous devez juste vous souvenir. Dans la programmation de socket Web, il suffit d'un serveur et d'un client. Exécutez d'abord le code serveur et ouvrez le code client. Et voila! J'espère que cela t'aides!

therealadrain
la source
4

Si vous voulez vraiment utiliser PHP comme backend pour les WebSockets, ces liens peuvent vous aider:

https://github.com/lemmingzshadow/php-websocket

http://www.htmlgoodies.com/html5/other/create-a-bi-directional-connection-to-a-php-server-using-html5-websockets.html#fbid=QqpDVi8FqD9

Chris Hanson
la source
1
Cela vous permet-il d'utiliser socket.io (avec tous ses transports et navigateurs pris en charge). Ou devez-vous utiliser le client fourni avec php-websocket?
Darren Cook le
3

Que dis-tu de ça ? PHPSocketio ?? C'est une alternative côté serveur php socket.io. La boucle d'événements est basée sur l'extension d'événement pecl. Bien que je ne l'ai pas essayé moi-même jusqu'à présent.

Sankalp Singha
la source
3

Nous sommes maintenant en 2018 et hoola, il existe un moyen d'implémenter WS et WAMPServer sur php. C'est appelé Ratchet .

shamaseen
la source
0

Je cherchais un moyen très simple pour que PHP envoie un message socket.io aux clients.

Cela ne nécessite aucune bibliothèque PHP supplémentaire - il utilise juste des sockets.

Au lieu d'essayer de vous connecter à l'interface websocket comme tant d'autres solutions, connectez-vous simplement au serveur node.js et utilisez .on('data')pour recevoir le message.

Ensuite, vous socket.iopouvez le transmettre aux clients.

Détectez une connexion depuis votre serveur PHP dans Node.js comme ceci:

//You might have something like this - just included to show object setup
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);

server.on("connection", function(s) {
    //If connection is from our server (localhost)
    if(s.remoteAddress == "::ffff:127.0.0.1") {
        s.on('data', function(buf) {
            var js = JSON.parse(buf);
            io.emit(js.msg,js.data); //Send the msg to socket.io clients
        });
    }
});

Voici le code php incroyablement simple - je l'ai enveloppé dans une fonction - vous pouvez trouver quelque chose de mieux.

Notez que 8080c'est le port de mon serveur Node.js - vous voudrez peut-être changer.

function sio_message($message, $data) {
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    $result = socket_connect($socket, '127.0.0.1', 8080);
    if(!$result) {
        die('cannot connect '.socket_strerror(socket_last_error()).PHP_EOL);
    }
    $bytes = socket_write($socket, json_encode(Array("msg" => $message, "data" => $data)));
    socket_close($socket);
}

Vous pouvez l'utiliser comme ceci:

sio_message("chat message","Hello from PHP!");

Vous pouvez également envoyer des tableaux qui sont convertis en json et transmis aux clients.

sio_message("DataUpdate",Array("Data1" => "something", "Data2" => "something else"));

C'est un moyen utile de «faire confiance» au fait que vos clients reçoivent des messages légitimes du serveur.

Vous pouvez également demander à PHP de transmettre les mises à jour de la base de données sans que des centaines de clients interrogent la base de données.

J'aurais aimé trouver cela plus tôt - j'espère que cela aide! 😉

user1274820
la source
1
Bonne idée, je cherchais un moyen de sauter les redis (si c'est une bonne idée)! Il y a une faute de frappe dans le premier code, un point-virgule après s.remoteAddress;. Cependant, je ne le fais pas fonctionner. J'obtiens la connexion dans le nœud, il détecte la connexion, l'adresse à distance est correcte, mais s.on('data')ne se produit jamais, mais rien ne se passe. J'ai essayé s.on('msg')aussi. J'utilise votre code PHP exact. J'utilise https, pour le serveur de nœuds, mais cela ne devrait pas avoir d'importance?
Niclas
@Niclas hé désolé pour la faute de frappe - je ne peux pas croire que c'était là depuis le début. Votre serveur de nœuds fonctionne-t-il sur le port 8080? Sinon, vous devez changer de port. Si tel est le cas, vérifiez le Remote Addressqui est renvoyé - assurez-vous qu'il s'agit de l'adresse de bouclage / locale - cela peut être différent avec la configuration de votre serveur. Pour le test, vous pouvez supprimer la ligneif(s.remoteAddress == "::ffff:127.0.0.1")
user1274820
Merci pour la réponse rapide! J'ai réussi à utiliser console.log jusqu'au bout, même l'adresse à distance était correcte, elle n'entre tout simplement pas dans la section s.on ('data'). Existe-t-il un moyen de tester quel message a été envoyé? Veuillez relire mon commentaire pour voir si j'ai manqué quelque chose. Je pourrais commencer comme une nouvelle question pour publier le code, mais c'est presque exactement le vôtre.
Niclas
J'ai commencé cela comme une nouvelle question pour faciliter la discussion en détail: stackoverflow.com/questions/53689391/...
Niclas