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