web-dev-qa-db-fra.com

Utiliser PHP avec Socket.io

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

Tous les exemples de code que je trouve pour socket.io semblent être ceux de node.js côté serveur, donc aucune aide.

115
Yuvi

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 font cela mieux que php ou pas, ce n'est pas le but.

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

Mais il y a quelques façons d'implémenter WebSockets . Il y a ce plugin jQuery vous permettant d'utiliser Websockets tout en se dégradant gracieusement pour les navigateurs non compatibles. Du côté de PHP, il y a cette classe qui semble être le plus utilisé pour les serveurs PHP WS.

97
Florian Margaine

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

site web du projet:

elephant.io

ils sont aussi sur github:

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

Elephant.io fournit un client socket.io entièrement écrit en PHP qui devrait pouvoir être utilisé 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 pouvaient pas être effectuées en JavaScript.

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 de 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);
  });
});
68
kasper Taeymans

UPDATE: août 2014 Le site actuel socket.io v1. a un exemple PHP: - https://github.com/rase-/socket.io-php-emitter

20
Alvin K.

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

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

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

Des 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);
  });
});
13
walkor

Euh, pourquoi voudriez-vous? Laissez PHP sur le serveur 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’exprime en cours d’exécution avec un terminal qui écoute expressément les interactions de PHP.

Par exemple, si j'ai envoyé un courrier électronique à 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, vous pouvez faire quelque chose comme ça:

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 pas de place dans ce domaine maintenant. Pourquoi faire une longue interrogation quand vous avez des websockets ou des flashsockets.

6
PaulM

Pour la "connexion de longue durée" que vous avez mentionnée, vous pouvez utiliser Ratchet pour PHP. C'est une bibliothèque construite sur les 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 voulez toujours utiliser Socket.io, vous pouvez essayer de cette façon: - trouver & obtenir socket.io.js pour que le client l'utilise - travailler avec Ratchet pour simuler le fonctionnement de socket.io sur le serveur

J'espère que cela t'aides!

6
Chung Xa

Je connais l'homme qui lutte! Mais j'ai récemment eu à peu près travailler avec Workerman. Si vous n'êtes pas tombé sur ce framework php, mieux vaut le vérifier!

Workerman est un cadre PHP piloté par les événements asynchrones permettant de créer facilement des applications réseau rapides et évolutives. (Je viens de copier et coller cela de leur site Web hahahah http://www.workerman.net/en/ )

Le moyen le plus simple d’expliquer cela est que, quand il s’agit de programmer un socket Web, tout ce dont vous avez besoin est d’avoir 2 fichiers sur votre serveur ou sur votre 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 effectuera les commandes demandées)

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

Eh bien, si vous utilisez xampp. Voici une façon de le faire. Allez où vous voulez mettre 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 ayez 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 aussi vérifier celui-ci. C'est vraiment important ! Vous avez besoin de cette bibliothèque javascript pour que vous client.php ou client.html communiquiez 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 server.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 client 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 votre terminal où vous avez mis votre fichier server.php. Donc, dans notre cas, C:/xampp/htdocs/websocket/et tapé php server.php start et appuyez sur enter.

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

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

5
therealadrain

Si vous voulez vraiment utiliser PHP comme backend pour WebSockets, ces liens peuvent vous aider à trouver votre chemin:

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

4
Chris Hanson

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

3
Sankalp Singha

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

2
shamaseen

Je ne l'ai pas encore essayé, mais vous devriez pouvoir le faire avec ReactPHP et this composant socket . Ressemble à Node, mais en PHP.

2
mpen

Je recherchais un moyen très simple d’obtenir PHP l’envoi d’un message socket.io aux clients.

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

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

Ensuite, socket.io peut le transférer aux clients.

Détectez une connexion de 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 8080 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" à ce 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 demander à des centaines de clients de l'interroger.

J'espère que j'ai trouvé ça plus tôt - espérons que cela aide! ????

1
user1274820

Regardez dans cette bibliothèque pour php http://phptrends.com/category/7 . Ou utilisez natif de php http://www.php.net/manual/en/book.sockets.php .

0
Knase