on

(erfordert Workerman-Version >= 3.3.0)

void \Channel\Client::on(string $event_name, callback $callback_function)

Abonnieren des $event_name Ereignisses und Registrieren der Rückruffunktion $callback_function bei Auftreten des Ereignisses.

Parameter der Rückruffunktion

$event_name

Der Name des abonnierten Ereignisses, kann eine beliebige Zeichenfolge sein.

$callback_function

Die Rückruffunktion, die bei Auftreten des Ereignisses ausgelöst wird. Der Funktionsprototyp lautet callback_function(mixed $event_data). $event_data sind die bei der Ereignisveröffentlichung (publish) übergebenen Ereignisdaten.

Hinweis:

Wenn für dasselbe Ereignis zwei Rückruffunktionen registriert werden, wird die zweite Rückruffunktion die erste überschreiben.

Beispiel

Multi-Prozess Worker (Multi-Server), ein Client sendet eine Nachricht, die an alle Clients broadcasted wird.

start.php

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// Initialisierung eines Channel-Servers
$channel_server = new Channel\Server('0.0.0.0', 2206);

// websocket-Server
$worker = new Worker('websocket://0.0.0.0:4236');
$worker->name = 'websocket';
$worker->count = 6;
// Bei Start jedes Worker-Prozesses
$worker->onWorkerStart = function($worker)
{
    // Channel-Client verbindet sich mit dem Channel-Server
    Channel\Client::connect('127.0.0.1', 2206);
    // Abonnieren des Broadcast-Ereignisses und Registrieren der Ereignisrückruffunktion
    Channel\Client::on('broadcast', function($event_data)use($worker){
        // Nachricht an alle Clients des aktuellen Worker-Prozesses broadcasten
        foreach($worker->connections as $connection)
        {
            $connection->send($event_data);
        }
    });
};

$worker->onMessage = function(TcpConnection $connection, $data)
{
   // Die vom Client gesendeten Daten als Ereignisdaten behandeln
   $event_data = $data;
   // Broadcast-Ereignis an alle Worker-Prozesse veröffentlichen
   \Channel\Client::publish('broadcast', $event_data);
};

Worker::runAll();

Test

Öffnen Sie den Chrome-Browser, drücken Sie F12, um die Entwicklertools zu öffnen, und geben Sie in der Konsole ein (oder fügen Sie den folgenden Code in eine HTML-Seite ein und führen Sie ihn mit JS aus):

Verbindung zum Empfang von Nachrichten

// Ersetzen Sie 127.0.0.1 durch die tatsächliche IP, auf der Workerman läuft
ws = new WebSocket("ws://127.0.0.1:4236");
ws.onmessage = function(e) {
    alert("Nachricht vom Server empfangen: " + e.data);
};

Broadcast-Nachricht

ws.send('hello world');