send

Descrizione:

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

Invia dati al client

Parametri

$data

I dati da inviare. Se è stato specificato un protocollo durante l'inizializzazione della classe Worker, verrà chiamato automaticamente il metodo encode del protocollo, completando il lavoro di imballaggio del protocollo prima di inviarlo al client.

$raw

Indica se inviare dati grezzi, ovvero non chiamare il metodo encode del protocollo. Il valore predefinito è false, ovvero il metodo encode del protocollo verrà chiamato automaticamente.

Valore di ritorno

true indica che i dati sono stati scritti con successo nel buffer di invio del socket del livello del sistema operativo di questa connessione.

null indica che i dati sono stati scritti nel buffer di invio del livello dell'applicazione di questa connessione e attendono di essere scritti nel buffer di invio del socket del livello di sistema.

false indica che l'invio è fallito. Il motivo del fallimento può essere che la connessione del client è già stata chiusa o che il buffer di invio del livello dell'applicazione di questa connessione è pieno.

Attenzione

Il valore di ritorno di send è true solo per indicare che i dati sono stati scritti con successo nel buffer di invio del socket del livello del sistema operativo di questa connessione, non significa che i dati siano stati inviati con successo al buffer di ricezione del socket opposto, né significa che l'applicazione opposta ha già letto i dati dal buffer di ricezione del socket locale. Tuttavia, fintanto che send non restituisce false e la rete non è disconnessa, e il client riceve normalmente, i dati possono essere considerati al 100% inviati all'altra parte.

Poiché i dati nel buffer di invio del socket vengono inviati in modo asincrono al lato opposto dal sistema operativo, il sistema operativo non fornisce un meccanismo di conferma corrispondente al livello dell'applicazione, quindi il livello dell'applicazione non può sapere quando i dati nel buffer di invio del socket iniziano a essere inviati, e il livello dell'applicazione non può sapere se i dati nel buffer di invio del socket sono stati inviati con successo. Per questo motivo, Workerman non può fornire direttamente un'interfaccia di conferma dei messaggi.

Se il business ha bisogno di garantire che ogni messaggio venga ricevuto dal client, si può aggiungere un meccanismo di conferma in ambito aziendale. Il meccanismo di conferma può variare a seconda del business, anche se lo stesso meccanismo di conferma può avere vari metodi.

Ad esempio, un sistema di chat può utilizzare un meccanismo di conferma simile. Ogni messaggio viene memorizzato nel database, e ogni messaggio ha un campo di stato di lettura. Ogni volta che il client riceve un messaggio, invia un pacchetto di conferma al server, che segna il messaggio corrispondente come letto. Quando il client si connette al server (di solito durante il login o il ripristino della connessione), interroga il database per eventuali messaggi non letti; se ci sono, vengono inviati al client, e analogamente il client notifica il server quando ha ricevuto i messaggi. In questo modo si può garantire che ogni messaggio venga ricevuto dall'altra parte. Naturalmente, gli sviluppatori possono implementare la propria logica di conferma.

Esempio

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)
{
    // Verrà automaticamente chiamato \Workerman\Protocols\Websocket::encode per impacchettare i dati in protocollo websocket e inviarli
    $connection->send("hello\n");
};
// Esegui il worker
Worker::runAll();