send
Descrição:
mixed Connection::send(mixed $data [,$raw = false])
Envia dados para o cliente
Parâmetros
$data
Os dados a serem enviados, se um protocolo foi especificado ao inicializar a classe Worker, o método encode do protocolo será chamado automaticamente, completando o empacotamento do protocolo antes de enviar ao cliente.
$raw
Indica se os dados devem ser enviados em formato bruto, ou seja, sem chamar o método encode do protocolo. O padrão é false, que chama automaticamente o método encode do protocolo.
Valor de Retorno
true indica que os dados foram escritos com sucesso no buffer de envio do socket do sistema operacional desta conexão.
null indica que os dados foram escritos no buffer de envio da camada de aplicação dessa conexão, aguardando para serem escritos no buffer de envio do socket do sistema.
false indica falha no envio, podendo ser devido ao fechamento da conexão do cliente, ou que o buffer de envio da camada de aplicação dessa conexão está cheio.
Atenção
O retorno de true do método send apenas representa que os dados foram escritos com sucesso no buffer de envio do socket do sistema operacional dessa conexão, não significa que os dados foram enviados com sucesso para o buffer de recebimento do socket do outro lado, nem que o aplicativo do outro lado já leu os dados do buffer de recebimento local. No entanto, enquanto send não retornar false e a rede estiver estável, e o cliente receber normalmente, os dados podem ser considerados 100% enviados ao destinatário.
Os dados no buffer de envio do socket são enviados pelo sistema operacional assíncronamente para o outro lado, e o sistema operacional não fornece um mecanismo de confirmação correspondente para a camada de aplicação. Portanto, a camada de aplicação não pode saber quando os dados no buffer de envio do socket começam a ser enviados, e a camada de aplicação também não pode saber se os dados no buffer de envio do socket foram enviados com sucesso. Por essas razões, o Workerman não pode fornecer uma interface de confirmação de mensagem diretamente.
Se o negócio requer que cada mensagem seja recebida pelo cliente, um mecanismo de confirmação pode ser adicionado ao negócio. O mecanismo de confirmação pode variar conforme o negócio, e mesmo o mesmo negócio pode ter várias maneiras de implementar a confirmação.
Por exemplo, um sistema de chat pode usar um mecanismo de confirmação dessa forma. Armazenar cada mensagem no banco de dados, onde cada mensagem tem um campo de leitura. Cada vez que o cliente recebe uma mensagem, ele envia um pacote de confirmação para o servidor, e o servidor marca a mensagem correspondente como lida. Quando o cliente se conecta ao servidor (geralmente quando o usuário faz login ou reconecta), ele consulta o banco de dados para ver se há mensagens não lidas, e se houver, as envia para o cliente; da mesma forma, assim que o cliente recebe a mensagem, ele notifica o servidor que a leu. Isso garante que todas as mensagens sejam recebidas. Claro que os desenvolvedores também podem usar sua própria lógica de confirmação.
Exemplo
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)
{
// Irá chamar automaticamente \Workerman\Protocols\Websocket::encode para empacotar os dados no protocolo websocket antes de enviar
$connection->send("hello\n");
};
// Executa o worker
Worker::runAll();