send

Descripción:

mixed Connection::send(mixed $data [,$raw = false])

Envía datos al cliente

Parámetros

$data

Los datos a enviar. Si se ha especificado un protocolo al inicializar la clase Worker, se llamará automáticamente al método encode del protocolo para empaquetar los datos antes de enviarlos al cliente.

$raw

Indica si se envían datos sin procesar, es decir, sin llamar al método encode del protocolo. El valor predeterminado es false, lo que significa que se llamará automáticamente al método encode del protocolo.

Valor de retorno

true indica que los datos se han escrito correctamente en el búfer de envío de sockets del sistema operativo de esa conexión.

null indica que los datos se han escrito en el búfer de envío de la capa de aplicación de esa conexión, esperando a ser escritos en el búfer de envío de sockets del sistema.

false indica que el envío ha fallado. Las razones del fallo pueden ser que la conexión del cliente ya esté cerrada o que el búfer de envío de la capa de aplicación de esa conexión esté lleno.

Nota

El retorno de send como true solo significa que los datos se han escrito correctamente en el búfer de envío de sockets del sistema operativo de esa conexión, no significa que los datos se hayan enviado correctamente al búfer de recepción de sockets del extremo opuesto, y no significa que la aplicación en el extremo opuesto haya leído los datos desde su propio búfer de recepción de sockets. Sin embargo, aun así, mientras send no retorne false y la red no esté caída, y el cliente reciba normalmente, se puede considerar que los datos se enviarán al destinatario con un 100% de fiabilidad.

Dado que los datos en el búfer de envío de sockets son enviados de manera asincrónica al extremo opuesto por el sistema operativo, y el sistema operativo no proporciona un mecanismo de confirmación correspondiente a la capa de aplicación, la capa de aplicación no puede saber cuándo comienzan a enviarse los datos en el búfer de envío de sockets, y la capa de aplicación no puede saber si los datos en el búfer de envío de sockets se han enviado correctamente. Por las razones anteriores, workerman no puede proporcionar directamente una interfaz de confirmación de mensajes.

Si el negocio requiere asegurar que cada mensaje sea recibido por el cliente, se puede agregar un mecanismo de confirmación en el negocio. El mecanismo de confirmación puede variar según el negocio, incluso el mismo mecanismo de confirmación puede tener múltiples enfoques.

Por ejemplo, un sistema de chat podría usar un mecanismo de confirmación así. Almacenar cada mensaje en una base de datos, cada mensaje tendría un campo que indica si ha sido leído. Cada vez que un cliente recibe un mensaje, envía un paquete de confirmación al servidor, y el servidor marca el mensaje correspondiente como leído. Cuando el cliente se conecta al servidor (generalmente al iniciar sesión o reconectarse), consulta la base de datos para ver si hay mensajes no leídos; si los hay, el servidor se los envía al cliente. Igualmente, después de que el cliente recibe el mensaje, notifica al servidor que ha sido leído. Esto garantiza que cada mensaje sea recibido por el destinatario. Por supuesto, los desarrolladores también pueden implementar su propia lógica de confirmación.

Ejemplo

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

$worker = new Worker('websocket://0.0.0.0:8484');
$worker->onMessage = function(TcpConnection $connection, $data)
{
    // Se llamará automáticamente a \Workerman\Protocols\Websocket::encode para empaquetar los datos en formato de protocolo websocket y enviarlos
    $connection->send("hello\n");
};
// Ejecución del worker
Worker::runAll();