Verwenden von PHP mit Socket.io

128

Ist es möglich, Sockets.io auf der Clientseite zu verwenden und mit einer PHP-basierten Anwendung auf dem Server zu kommunizieren? Unterstützt PHP überhaupt eine solche "langlebige Verbindung" zum Schreiben von Code?

Der gesamte Beispielcode, den ich für socket.io finde, scheint für node.js auf der Serverseite zu sein, daher gibt es dort keine Hilfe.

Yuvi
quelle
3
Mögliches Duplikat: Socket.io aus PHP-Quelle
hakre
Vielleicht möchten Sie nur Drücker in Betracht ziehen. Es hat eine raffinierte PHP-Bibliothek, die ich verwenden werde.
Devin G Rhode
Hallo, versuchen Sie dieses - github.com/walkor/phpsocket.io
Zhenya Hristova

Antworten:

98

Es mag etwas spät sein, diese Frage zu beantworten, aber hier ist, was ich gefunden habe.

Ich möchte nicht darüber diskutieren, dass Knoten das besser machen als PHP oder nicht, das ist nicht der Punkt.

Die Lösung lautet: Ich habe keine Implementierung von socket.io für PHP gefunden.

Es gibt jedoch einige Möglichkeiten, WebSockets zu implementieren . Es gibt dieses jQuery-Plugin , mit dem Sie Websockets verwenden können, während Sie sich für nicht unterstützende Browser elegant verschlechtern. Auf der PHP-Seite gibt es diese Klasse , die am häufigsten für PHP-WS-Server verwendet wird.

Florian Margaine
quelle
1
Die phpwebsocket-Klasse ist in der Tat der richtige Weg, wenn Sie eine PHP-Websocket-Server-Implementierung wünschen. Dies hängt jedoch nicht mit der Frage zusammen. Das OP hat bereits einen WS-Server (socket.io) implementiert und nach Möglichkeiten zur Kommunikation mit einer PHP-Anwendung gefragt.
Kasper Taeymans
72

Wenn Sie socket.io zusammen mit PHP verwenden möchten, kann dies Ihre Antwort sein!

Projektwebsite:

elefant.io

Sie sind auch auf Github:

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

Elephant.io bietet einen vollständig in PHP geschriebenen Socket.io-Client, der überall in Ihrem Projekt verwendet werden kann.

Es ist eine leichte und benutzerfreundliche Bibliothek, die darauf abzielt, einer PHP-Anwendung über socket.io und Websockets Echtzeitfunktionen für Aktionen bereitzustellen, die nicht in vollständigem Javascript ausgeführt werden konnten.

Beispiel von der Projektwebsite (Kommunikation mit dem Websocket-Server über PHP)

PHP-Server

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

Socket Io Server

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
quelle
2
Ich gebe Ihnen hier eine +1, aber es sieht so aus, als ob dies noch ein kleines Stück von der Verwendung in einer Produktionsumgebung entfernt ist.
Beachhouse
17
Ich habe diesen gesehen, aber eines hat mich verwirrt. Ist es hier nicht sinnvoll, dass PHP einen sockets.io-Server implementiert? Stattdessen scheint Elepant.io eine PHP-Implementierung eines sockets.io-Clients zu sein, für den Sie eine Verbindung zu einem anderen sockets.io-Server herstellen können (dh ,elefant.io wartet nicht auf Verbindungen von Ihren sockets.io-Clients und stellt eine Verbindung her zu ihnen und zu ihnen zu warten)?
Pimp Trizkit
Genau das, wonach ich gesucht habe, schade, dass sich die dauerhafte Verbindung in einem frühen Entwicklungsstadium befindet.
Slezadav
8
Hallo zusammen. Elephant.io zielt nur darauf ab, Ereignisse von PHP auf einen socket.io-Server auszulösen. Eine dauerhafte Verbindung nicht zu öffnen. Aber um schnell eine Verbindung herstellen und Ereignisse / Nachrichten senden zu können. Wir verwenden es in der Produktion und es funktioniert wie ein Zauber.
Guillaumepotier
3
Diese Bibliothek wird nicht mehr gepflegt und hat einige Probleme für uns
Flion
14

Wenn Sie PHP wirklich als Backend für socket.io verwenden möchten, habe ich Folgendes gefunden. Zwei socket.io PHP serverseitige Alternative.

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

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

Beispielcodes für das erste Repository wie dieses.

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

Für die von Ihnen erwähnte "langlebige Verbindung" können Sie Ratchet für PHP verwenden. Es ist eine Bibliothek, die auf Stream Socket-Funktionen basiert, die PHP seit PHP 5 unterstützt.

Für die Clientseite müssen Sie WebSocket verwenden, das von HTML5 unterstützt wird, anstelle von Socket.io (da Sie wissen, funktioniert socket.io nur mit node.js).

Wenn Sie Socket.io weiterhin verwenden möchten, können Sie Folgendes versuchen: - Suchen und Abrufen von socket.io.js für den Client - Arbeiten Sie mit Ratchet zusammen, um die Vorgehensweise von socket.io auf dem Server zu simulieren

Hoffe das hilft!

Chung Xa
quelle
6

Ähm, warum willst du das? Lassen Sie PHP im Backend und NodeJS / Sockets, um die nicht blockierende Aufgabe zu erledigen.

Hier finden Sie Informationen zum Einstieg: http://groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc

Persönlich habe ich Express-Laufen mit einem Endpunkt, der ausdrücklich auf die Interaktion von PHP wartet.

Wenn ich beispielsweise einem Benutzer eine E-Mail gesendet habe, soll socket.io dem Benutzer eine Echtzeitbenachrichtigung anzeigen.

Willst du Interaktion von socket.io zu PHP, dann kannst du einfach so etwas machen:

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

Im Ernst, PHP ist großartig, um serverseitige Dinge zu erledigen und es mit den Verbindungen zu tun, die es derzeit in dieser Domäne nicht hat. Warum sollten Sie lange abfragen, wenn Sie Websockets oder Flashsockets haben?

PaulM
quelle
32
Weil einige von uns nur einen billigen Host bekommen können, mit dem Sie nur PHP und MySQL verwenden können.
Lanbo
31
Weil einige von uns mit vorhandenen Frameworks arbeiten müssen, die von PHP abhängen. Zum Beispiel entwickeln und verkaufen wir ein PHP-Skript, möchten aber die IM durch die Verwendung von Websockets verbessern. Wir möchten nicht alle Fallbacks schreiben, die socket.io bereits implementiert hat, aber wir können NodeJS nicht von unseren Kunden verlangen.
Purefan
3
@PaulM: Ich habe nur wenige <10 $ VPS-Anbieter ausprobiert, und all diese sind wirklich scheiße. Jeder war sehr langsam, wenn etwas kaputt ist, der Support schrecklich ist usw. Andererseits ist es in Finnland nicht selten, dass Webhosting von angemessener Qualität (aber nur mit PHP- / MySQL- / statischen Dateien) mit ADSL-Abonnement ohne zusätzliche Kosten angeboten wird . Also nein, es ist definitiv keine Lösung, beschissenes VPS für 5 Dollar kaufen zu können.
Olli
4
Für <10 US-Dollar VPS-Anbieter ist digitalocean.com der einzige anständige Anbieter, den ich bisher gefunden habe. Aber das ist ziemlich gut.
Aeolun
3
Ich stimme nicht zu Ich denke, eine solche Antwort ist sehr relevant. Jemand, der Ihnen sagt, dass Sie es falsch verwenden, könnte viel mehr wert sein als jemand, der Ihnen hilft, es falsch zu verwenden.
Rijk
6

Ich kenne den Kämpfer! Aber ich hatte es vor kurzem ziemlich mit Workerman zu tun. Wenn Sie nicht über dieses PHP-Framework gestolpert sind, sollten Sie dies überprüfen!

Nun, Workerman ist ein asynchrones ereignisgesteuertes PHP-Framework zum einfachen Erstellen schneller, skalierbarer Netzwerkanwendungen. (Ich habe das gerade von ihrer Website kopiert und eingefügt, hahahah http://www.workerman.net/en/ )

Die einfache Möglichkeit, dies zu erklären, besteht darin, dass Sie für die Web-Socket-Programmierung lediglich zwei Dateien auf Ihrem Server oder lokalen Server (wo immer Sie arbeiten) benötigen.

  1. server.php (Quellcode, der auf alle Anfragen des Clients reagiert)

  2. client.php / client.html (Quellcode, der die anfordernden Dinge erledigt )

Im Grunde genommen korrigieren Sie den Code zuerst auf Ihrer server.php und starten den Server. Normalerweise starte ich den Server über diesen Befehl -> php server.php start , da ich Windows verwende, das den Kampf noch verstärkt

Nun, wenn Sie xampp verwenden. Hier ist eine Möglichkeit, dies zu tun. Gehen Sie dorthin, wo Sie Ihre Dateien ablegen möchten. In unserem Fall werden wir die Dateien ablegen

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

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

Angenommen, Sie haben diese Dateien bereits auf Ihrem lokalen Server. Öffnen Sie Ihren Git Bash oder Command Line oder Terminal oder was auch immer Sie verwenden und laden Sie die PHP-Bibliotheken hier herunter.

https://github.com/walkor/Workerman

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

Normalerweise lade ich es über den Composer herunter und lade diese Dateien automatisch in meine PHP-Skripte.

Und überprüfen Sie auch dieses. Das ist wirklich wichtig ! Sie benötigen diese Javascript-Bibliothek, damit client.php oder client.html beim Ausführen mit server.php kommunizieren können.

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

Ich habe gerade diesen socket.io-client-Ordner auf derselben Ebene wie meine server.php und meine client.php kopiert und eingefügt

Hier ist der server.php Quellcode

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

Und hier ist die client.php oder client.html Source

<!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>

Öffnen Sie erneut Ihre Befehlszeile oder Git Bash oder Ihr Terminal, in dem Sie Ihre server.php-Datei ablegen. In unserem Fall ist das also C: / xampp / htdocs / websocket / und wir geben php server.php ein und drücken die Eingabetaste.

Gehen Sie dann zu Ihrem Browser und geben Sie http: //localhost/websocket/client.php ein , um Ihre Site zu besuchen. Geben Sie dann einfach etwas in dieses Textfeld ein und Sie werden unterwegs einen einfachen PHP-Websocket sehen!

Sie müssen sich nur erinnern. Bei der Web-Socket-Programmierung werden lediglich ein Server und ein Client benötigt. Führen Sie zuerst den Servercode aus und öffnen Sie den Clientcode. Und da hast du es! Hoffe das hilft!

Therealadrain
quelle
4

Wenn Sie PHP wirklich als Backend für WebSockets verwenden möchten, können Sie sich über diese Links auf den Weg machen:

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
quelle
1
Auf diese Weise können Sie socket.io (mit allen unterstützten Transporten und Browsern) verwenden. Oder müssen Sie den Client verwenden, der mit PHP-Websocket geliefert wird?
Darren Cook
3

Wie wäre es damit ? PHPSocketio ?? Es ist eine socket.io PHP-Server-Alternative. Die Ereignisschleife basiert auf der Erweiterung des Pecl-Ereignisses. Obwohl ich es bis jetzt noch nicht selbst ausprobiert habe.

Sankalp Singha
quelle
2

Ich habe es noch nicht ausprobiert, aber Sie sollten dies mit ReactPHP und dieser Socket-Komponente tun können . Sieht genauso aus wie Node, aber in PHP.

mpen
quelle
2

Wir sind jetzt im Jahr 2018 und hoola, es gibt eine Möglichkeit, WS und WAMPServer auf PHP zu implementieren. Es heißt Ratsche .

Schamaseen
quelle
0

Ich suchte nach einer wirklich einfachen Möglichkeit, PHP dazu zu bringen, eine socket.io-Nachricht an Clients zu senden.

Dies erfordert keine zusätzlichen PHP-Bibliotheken - es werden nur Sockets verwendet.

Anstatt wie so viele andere Lösungen zu versuchen, eine Verbindung zur Websocket-Schnittstelle herzustellen, stellen Sie einfach eine Verbindung zum Server node.js her und verwenden Sie diese .on('data'), um die Nachricht zu empfangen.

Dann socket.iokann es an Kunden weiterleiten.

Erkennen Sie eine Verbindung von Ihrem PHP-Server in Node.js wie folgt:

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

Hier ist der unglaublich einfache PHP-Code - ich habe ihn in eine Funktion eingewickelt - Sie können sich etwas Besseres einfallen lassen.

Beachten Sie, dass dies 8080der Port zu meinem Node.js-Server ist - möglicherweise möchten Sie ihn ändern.

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

Sie können es so verwenden:

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

Sie können auch Arrays senden, die in json konvertiert und an Clients weitergegeben werden.

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

Dies ist eine nützliche Methode, um zu "vertrauen", dass Ihre Clients legitime Nachrichten vom Server erhalten.

Sie können PHP auch Datenbankaktualisierungen weitergeben lassen, ohne dass Hunderte von Clients die Datenbank abfragen.

Ich wünschte, ich hätte das früher gefunden - hoffe, das hilft! 😉

user1274820
quelle
1
Gute Idee, ich habe nach einer Möglichkeit gesucht, Redis zu überspringen (wenn das eine gute Idee ist)! Der erste Code enthält einen Tippfehler, danach ein Semikolon s.remoteAddress;. Ich bekomme es jedoch nicht zum Laufen. Ich bekomme die Verbindung im Knoten, es erkennt die Verbindung, die Remoteadresse ist korrekt, aber es s.on('data')passiert nie, aber nichts passiert. Ich habe es auch versucht s.on('msg'). Ich verwende Ihren genauen PHP-Code. Ich verwende https für den Knotenserver, aber das sollte keine Rolle spielen?
Niclas
@Niclas hey sorry wegen des Tippfehlers - kann nicht glauben, dass das die ganze Zeit da war. Läuft Ihr Knotenserver am Port 8080? Wenn nicht, müssen Sie den Port ändern. Wenn ja, überprüfen Sie, ob das Remote Addresszurückgegeben wird - stellen Sie sicher, dass es sich um die Loopback- / lokale Adresse handelt - dies kann bei Ihrem Server-Setup anders sein. Zum Testen können Sie die Zeileif(s.remoteAddress == "::ffff:127.0.0.1")
user1274820
Danke für die schnelle Antwort! Ich habe console.log den ganzen Weg erfolgreich gemacht, auch wenn die Remoteadresse richtig war, sie wird einfach nicht in den Abschnitt s.on ('data') eingegeben. Gibt es eine Möglichkeit zu testen, welche Nachricht gesendet wurde? Bitte lesen Sie meinen Kommentar erneut, um festzustellen, ob ich etwas verpasst habe. Ich könnte dies als eine neue Frage zum Posten des Codes beginnen, aber es ist fast genau wie bei Ihnen.
Niclas
Ich habe dies als neue Frage begonnen, um die Diskussion im Detail zu vereinfachen
Niclas