Cómo enviar mensajes al cliente de manera oportuna en el fondo de PHP
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)
{ p>
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)