Utilizzo di PHP con Socket.io


128

È possibile utilizzare Sockets.io sul lato client e comunicare con un'applicazione basata su PHP sul server? PHP supporta anche un modo di "connessione di lunga durata" per scrivere codice?

Tutto il codice di esempio che trovo per socket.io sembra essere per node.js sul lato server, quindi nessun aiuto lì.


3
Possibile duplicato: Socket.io dalla fonte php
hakre,

Potresti voler considerare solo il pusher. Ha un'elegante libreria PHP che userò.
Devin G Rhode,

Risposte:


98

Potrebbe essere un po 'tardi per rispondere a questa domanda, ma ecco cosa ho trovato.

Non voglio discutere sul fatto che i nodi lo fanno meglio di php o no, non è questo il punto.

La soluzione è: non ho trovato alcuna implementazione di socket.io per PHP.

Ma ci sono alcuni modi per implementare WebSocket . C'è questo plug-in jQuery che ti consente di utilizzare Websocket mentre si degrada con garbo per i browser non supportati. Sul lato PHP, esiste questa classe che sembra essere la più utilizzata per i server PHP WS.


1
la classe phpwebsocket è davvero la strada da percorrere se si desidera un'implementazione del server websocket php. Tuttavia questo non è correlato alla domanda. L'OP ha già implementato un server WS (socket.io) e ha chiesto modi per comunicare con un'applicazione php.
Kasper Taeymans il

72

Se vuoi usare socket.io insieme a php questa potrebbe essere la tua risposta!

sito web del progetto:

elephant.io

sono anche su github:

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

Elephant.io fornisce un client socket.io completamente scritto in PHP che dovrebbe essere utilizzabile ovunque nel progetto.

È una libreria leggera e facile da usare che mira a portare alcune funzionalità in tempo reale a un'applicazione PHP tramite socket.io e websocket per azioni che non possono essere eseguite in javascript completo.

esempio dal sito web del progetto (comunicare con websocket server tramite php)

server 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`';

server 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);
  });
});

2
Ti darò un +1 qui, ma sembra che questo sia ancora un po 'lontano dall'essere utilizzabile in un ambiente di produzione.
Beachhouse,

17
Ho visto questo, ma una cosa mi ha confuso. Il punto qui non è avere PHP implementare un server sockets.io? e, invece, Elepant.io sembra essere un'implementazione PHP di un client sockets.io per il quale è possibile connettersi ad altri server sockets.io (il che significa che elephant.io non è in ascolto di connessioni dai client sockets.io, connessione a loro e loro di manutenzione)?
Pimp Trizkit,

Proprio quello che sono venuto alla ricerca, peccato che la connessione persistente sia nelle prime fasi di sviluppo.
slezadav,

8
Ciao a tutti. L'obiettivo di Elephant.io è solo quello di lanciare eventi da PHP a un server socket.io. Non aprire una connessione persistente. Ma per essere in grado di connettersi rapidamente e inviare eventi / messaggi. Lo usiamo in produzione e funziona come un fascino.
guillaumepotier,

3
questa libreria non è più gestita e presenta alcuni problemi per noi
Flion,


14

Se vuoi davvero usare PHP come backend per socket.io, ecco cosa ho trovato. Due alternative lato server php socket.io.

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

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

Esempio di codici per il primo repository come questo.

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);
  });
});

7

Per la "connessione di lunga durata" che hai citato, puoi usare Ratchet per PHP. È una libreria costruita sulla base delle funzioni Stream Socket che PHP supporta da PHP 5.

Per il lato client, è necessario utilizzare WebSocket supportato da HTML5 invece di Socket.io (come sai, socket.io funziona solo con node.js).

Se vuoi ancora usare Socket.io, puoi provare in questo modo: - trova e ottieni socket.io.js per il client da usare - lavora con Ratchet per simulare il modo in cui socket.io fa sul server

Spero che questo ti aiuti!


6

Ehm, perché dovresti volerlo? Lascia PHP sul backend e NodeJS / Socket per fare la sua cosa non bloccante.

Ecco qualcosa per iniziare: http://groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc

Personalmente ho express running con un endpoint che sta ascoltando espressamente l'interazione da PHP.

Ad esempio, se ho inviato a un utente un'e-mail, voglio che socket.io visualizzi una notifica in tempo reale all'utente.

Vuoi l'interazione da socket.io a php, bene puoi fare qualcosa del genere:

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();  

Seriamente, PHP è ottimo per fare cose sul lato server e lasciare che sia con le connessioni che non ha posto in questo dominio ora. Perché eseguire qualsiasi polling lungo quando si hanno prese Web o prese flash.


32
Perché alcuni di noi sono solo in grado di ottenere un host economico che ti permetterà di usare solo php e mysql.
Lanbo,

31
Perché alcuni di noi devono lavorare con framework esistenti che dipendono da PHP. Ad esempio sviluppiamo e vendiamo uno script PHP, ma vorremmo migliorare la messaggistica istantanea utilizzando websocket, non vogliamo scrivere tutti i fallback che socket.io ha già implementato ma non possiamo richiedere NodeJS dai nostri clienti.
Purefan,

3
@PaulM: ho provato pochi <VPS da $ 10, e tutti quelli che fanno davvero schifo. Ognuno è stato molto lento, quando qualcosa è rotto, il supporto è orribile ecc. D'altra parte, in Finlandia non è raro ottenere un hosting web di qualità decente (ma solo con file php / mysql / static) con abbonamento adsl, senza pagare alcun extra . Quindi no, essere in grado di acquistare VPS scadenti per $ 5 non è sicuramente una soluzione.
Olli

4
Per <$ 10 provider VPS, l'unico decente che ho trovato finora è digitalocean.com. Ma quello è abbastanza buono.
Aeolun,

3
Non sono d'accordo Penso che una risposta come questa sia molto pertinente. Qualcuno che ti dice "lo stai usando male" potrebbe valere molto di più di qualcuno che ti aiuti ad usarlo male.
Rijk,

6

Conosco l'uomo della lotta! Ma recentemente ho avuto praticamente a lavorare con Workerman. Se non ti sei imbattuto in questo framework php, allora è meglio dare un'occhiata!

Bene, Workerman è un framework PHP asincrono guidato da eventi per creare facilmente applicazioni di rete veloci e scalabili. (L'ho appena copiato e incollato dal loro sito web hahahah http://www.workerman.net/en/ )

Il modo più semplice per spiegarlo è che quando si tratta di programmare un socket web tutto ciò che devi veramente avere è avere 2 file nel tuo server o server locale (ovunque tu stia lavorando).

  1. server.php (codice sorgente che risponderà a tutte le richieste del cliente)

  2. client.php / client.html (codice sorgente che farà le cose richieste)

Quindi, fondamentalmente, devi prima correggere il codice su server.php e avviare il server. Normalmente, come sto usando Windows che aggiunge più della lotta, corro il server attraverso questo comando -> php server.php start

Bene se stai usando xampp. Ecco un modo per farlo. Vai dove vuoi mettere i tuoi file. Nel nostro caso, inseriremo i file

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

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

Supponendo che tu abbia già quei file nel tuo server locale. Apri Git Bash o Command Line o Terminal o quello che stai usando e scarica qui le librerie php.

https://github.com/walkor/Workerman

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

Di solito lo scarico tramite il compositore e carico automaticamente quei file nei miei script php.

E controlla anche questo. Questo è davvero importante ! È necessario questo libary javascript affinché client.php o client.html comunichino con server.php quando lo si esegue.

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

Ho appena copiato e incollato quella cartella socket.io-client allo stesso livello del mio server.php e del mio client.php

Ecco il codice sorgente 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();

Ed ecco il codice sorgente client.php o 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>

Ancora una volta, apri la riga di comando o git bash o il terminale in cui inserisci il tuo file server.php. Quindi nel nostro caso, questo è C: / xampp / htdocs / websocket / e digitato php server.php start e premere invio .

Quindi vai al tuo browser e digita http: //localhost/websocket/client.php per visitare il tuo sito. Quindi digita qualsiasi cosa in quella casella di testo e vedrai un websocket di base php in movimento!

Devi solo ricordare. Nella programmazione di socket Web, ha solo bisogno di un server e un client. Eseguire prima il codice del server e aprire il codice del client. E il gioco è fatto! Spero che questo ti aiuti!



3

Cosa ne pensi di questo ? PHPSocketio ?? È un'alternativa lato server socket.io php. Il ciclo degli eventi si basa sull'estensione dell'evento pecl. Anche se non l'ho provato da solo fino ad ora.


3

Siamo ora nel 2018 e hoola, c'è un modo per implementare WS e WAMPServer su php. Si chiama Ratchet .




0

Stavo cercando un modo davvero semplice per convincere PHP a inviare un messaggio socket.io ai clienti.

Ciò non richiede ulteriori librerie PHP, ma utilizza solo socket.

Invece di provare a connettersi all'interfaccia websocket come tante altre soluzioni, basta collegarsi al server node.js e utilizzare .on('data')per ricevere il messaggio.

Quindi, è socket.iopossibile inoltrarlo ai client.

Rileva una connessione dal tuo server PHP in Node.js in questo modo:

//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
        });
    }
});

Ecco il codice php incredibilmente semplice - l'ho racchiuso in una funzione - potresti trovare qualcosa di meglio.

Nota che 8080è la porta sul mio server Node.js - potresti voler cambiare.

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);
}

Puoi usarlo in questo modo:

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

È inoltre possibile inviare matrici che vengono convertite in json e passate ai client.

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

Questo è un modo utile per "fidarsi" che i tuoi client ricevano messaggi legittimi dal server.

Puoi anche fare in modo che PHP passi con gli aggiornamenti del database senza che centinaia di client interrogino il database.

Vorrei averlo trovato prima - spero che questo aiuti! 😉


1
Bella idea, stavo cercando un modo per saltare redis (se questa è una buona idea)! C'è un refuso nel primo codice, un punto e virgola dopo s.remoteAddress;. Tuttavia, non lo farò funzionare. Ricevo la connessione nel nodo, rileva la connessione, l'indirizzo remoto è corretto, ma s.on('data')non succede mai, ma non succede nulla. Ci ho provato s.on('msg')anche io . Sto usando il tuo codice PHP esatto. Sto usando HTTPS, per il nodo server, ma non dovrebbe importare?
Niclas,

@Niclas ehi scusa per l'errore di battitura - non riesco a credere che fosse lì da sempre. Il tuo nodo server è in esecuzione sulla porta 8080? In caso contrario, è necessario modificare la porta. In tal caso, controlla Remote Addressche venga restituito - assicurati che sia l'indirizzo di loopback / locale - potrebbe essere diverso con la configurazione del tuo server. Per i test, è possibile rimuovere la rigaif(s.remoteAddress == "::ffff:127.0.0.1")
user1274820

Grazie per la risposta rapida! Ho eseguito correttamente console.log fino in fondo, anche il remoteaddress era giusto, semplicemente non entra nella sezione s.on ('data'). C'è un modo per testare quale messaggio è stato inviato? Rileggi il mio commento per vedere se ho perso qualcosa. Potrei iniziare questo come una nuova domanda per pubblicare il codice, ma è quasi esattamente come il tuo.
Niclas,

Ho iniziato questo come una nuova domanda per rendere più semplice la discussione in dettaglio: stackoverflow.com/questions/53689391/…
Niclas
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.