Red de conocimiento informático - Material del sitio web - Cómo enviar mensajes al cliente de manera oportuna en el fondo de PHP

Cómo enviar mensajes al cliente de manera oportuna en el fondo de PHP

Código de backend

push.php

Usar Workerman\Worker;

require_once './Workerman/Autoloader.php ';

//Inicializa un contenedor Worker con un puerto de escucha de 1234

$worker = new Worker('websocket://0.0.0.0:1234');

//El número de procesos aquí debe establecerse en 1

$worker->count = 1;

// El proceso de trabajo se inicia y establece un puerto de comunicación interna

$worker->onWorkerStart = function($worker)

{

// Abre un puerto interno para que los sistemas internos envíen datos, formato de protocolo de texto Texto + saltos de línea

$inner_text_worker = new Worker('Text. /0://0.0.0.0:5678');

$inner_text_worker->onMessage = function($conexión , $buffer)

{

global $worker;

// $formato de matriz de datos, que contiene uid, lo que indica que el uid se utiliza para enviar datos a la página

$data = json_decode($buffer, true);

$uid = $data['uid'];

// Enviar datos a la página con uid a través de Worker

$ret = sendMessageByUid($uid, $buffer);

// Devuelve el resultado del envío

$connection-> enviar($ret ?'ok' : 'fail');

};

$inner_text_worker->listen();

};

// Agregue una nueva propiedad para guardar la asignación de uid a la conexión

$worker->.uidConnections = array();

// Función de devolución de llamada ejecutada cuando el cliente envía un mensaje

$worker->onMessage = function($connection, $data)use($worker)

{

// Determina si el cliente actual está autenticado, incluyendo si el uid está configurado

p>

if(! isset($connection->uid))

{

// Si no se pasa la autenticación, trate el primer paquete como uid (para fines de demostración, no aquí para autenticación real)

$conexión->uid = $data;

/* Guarde una asignación de uid a conexión para que pueda buscar fácilmente una conexión por uid,

* Habilitar envío de datos para uid específico

*/

$worker->.uidConnections[$connection->uid] = $connection;

p>

Volver ;

}

};

// Cuando se desconecta la conexión del cliente

$worker-> onClose = function($connection)use($worker)

p>

{

global $trabajador;

if(isset($conexión->uid))

{

// Eliminar asignación cuando se desconecta la conexión

unset($worker->uidConnections[$connection->uid]);

}

};

// Enviar datos a todos los usuarios autenticados

función broadcast($message)

{

global $worker;

p>

foreach($worker->uidConnections as $conexión)

{

$conexión->enviar($mensaje);

}

}

// Enviar datos según la función uid

sendMessageByUid($uid, $message)

{

global $trabajador;

if(isset($worker->uidConnections[$uid]))

{

$ conexión = $trabajador->uidConnections[$uid];

$conexión->enviar($message) )

Devuelve verdadero;

}

Devuelve falso;

}

// Ejecuta todos los trabajadores (en realidad, actualmente solo hay uno definido)

Worker::runAll();

Iniciar el servicio en segundo plano

php push.php start -d

El código JS se utiliza para que el front-end reciba push

var ws = new WebSocket( 'ws://127.0.0.1:1234');

ws.onopen = function(){

var uid = ' uid1';

ws .send(uid);

};

ws.onmessage = function(e){

var uid = ' uid1 ';

ws.send(uid);

};

ws.onmessage = function(e){

ws. onmessage = función(e);

ws.onmessage = función(e)