Ich bin nur ein Anfänger in diesem ganzen Bereich mit Websocket, Ratchet und ZeroMQ.Wie bindet man den ZeroMQ-Socket mit der Ratchet-Web-Socket-Bibliothek, um eine Echtzeit-Anwendung für die PHP-Anwendung zu erstellen?
Zu meinem Grundverständnis:
websocket
ist etwas, die offene Verbindung zwischen Server und Client erstellen kann.
Ratchet
ist eine PHP-basierte Bibliothek, die die PHP Socket-Funktionen verwendet, um ein PHP-Socket-Framework zu erstellen, das es uns ermöglicht, PHP-Socket-Programmierung zu vereinfachen.
ZeroMQ
ist eine Socket-Bibliothek, die nicht-Ratchet-Anwendung (andere PHP-Skript) hilft, die Daten über Ratchet-Socket und Web-Socket zu senden.
Ich folge dem Tutorial in Ratchet über 'Hallo Welt' und 'Pusher', aber beide scheint unvollständig zu sein und lehrt nur, wie man nur mit der Konsole arbeitet. Ich habe auch ein Ratschen-Beispiel in Github gefunden, aber es ist nicht richtig dokumentiert. Ich war auf der Suche nach einem vollständigen Beispiel (mit einer dedizierten HTML-Seite und Javascript)
Unten ist der Code, ich arbeite an: Dies ist eine der Methode des Controllers, die ich eine Ajax-Anfrage für. Diese Methode erstellt einen neuen Post (sagen wir mal). Ich möchte die Liste der Post dynamisch im Browser des Multi-Clients aktualisieren, indem ich mit Hilfe von ZeroMq sende oder drehe.
Verfahren in einem Controller:
public function create_new_post(){
// ------
// code to create a new post.
// -------
// After creating a post
$response = [
'new_post_title' => $title,
'post_id' => $id
];
$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher');
$socket->connect("tcp://localhost:8000");
$socket->send(json_encode($response));
}
Pusher Datei:
use Ratchet\ConnectionInterface;
use Ratchet\Wamp\WampServerInterface;
class Pusher implements WampServerInterface{
public function onPostEntry($data){
// Data that were sent by ZeroMQ through create_new_post() method
$entry_data = json_decode($data);
// AND AFTER THIS, I DONT HAVE CLUE OF WHAT TO DO NEXT !!
}
}
Shell-Skript ausführen Server:
require dirname(__DIR__) . '/vendor/autoload.php';
$loop = React\EventLoop\Factory::create();
$pusher = new MyApp\Pusher;
// Listen for the web server to make a ZeroMQ push after an ajax request
$context = new React\ZMQ\Context($loop);
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind('tcp://127.0.0.1:8000');
$pull->on('message', array($pusher, 'onBidEntry'));
// Set up our WebSocket server for clients wanting real-time updates
$webSock = new React\Socket\Server($loop);
$webSock->listen(8080, '0.0.0.0');
$webServer = new Ratchet\Server\IoServer(
new Ratchet\Http\HttpServer(
new Ratchet\WebSocket\WsServer(
new Ratchet\Wamp\WampServer(
$pusher
)
)
),
$webSock
);
$loop->run();
Shell-Skript sagt nur, dass es im Hafen dienen 8080, aber wie würde ich meine Routen nennen? Sagen wir, ich möchte die offene Verbindung nur in der Seite 'mysite/allposts'. Außerdem, was wäre das Skript, das ich auf der Client-Seite (eine Javascript-Datei) schreiben muss und wie man diese neuen Daten durch Client-Seite erhält, die ein bestimmtes DOM-Objekt aktualisiert.
(nicht erfassbar) Eine wichtige Sache, die ich weiß, ist, dass 'Ratchet ein serverseitiges Skript ist, das in der Lage ist, ZMQ-Nachrichten zu hören'. Konzeptionell habe ich das verstanden. Aber ich habe nicht verstanden, wie es technisch funktioniert (Codierung). Ich denke, in der Controller-Methode (in der obigen Frage) ist das Erstellen einer ZMQ-Nachricht, die als Json-codierte Nachricht an Ratchet übertragen wird. GENAU DA ! Ich habe nicht verstanden, wo und wie diese verschlüsselte Nachricht von Ratchet empfangen wird und wie Ratchet wissen würde, dass diese Methode ausgeführt wurde. Welcher Teil des Codes macht das? –
Schließlich habe ich meine Anwendung mit Ratchet arbeiten lassen, obwohl ich diesmal kein ZMQ benutzt habe. Meine Anwendung ist klein, also entschied ich mich diesmal nicht für ZMQ. Die Erklärung, die Sie über die Kohärenz von autobahn.js mit dem Web-Socket gegeben haben, ist sehr hilfreich. Ich werde diese Antwort in Zukunft erneut beziehen, wenn ich ZMQ auf meiner Anwendung verwenden muss, wenn meine Anwendung größer wird. –