send
Описание:
mixed Connection::send(mixed $data [,$raw = false])
Отправляет данные клиенту
Параметры
$data
Данные, которые нужно отправить. Если при инициализации класса Worker задан протокол, будет автоматически вызван метод encode протокола, чтобы упаковать данные для отправки клиенту.
$raw
Отправлять ли исходные данные, т.е. не вызывать метод encode протокола. По умолчанию равно false, то есть автоматически вызывается метод encode протокола.
Возвращаемое значение
true означает, что данные были успешно записаны в буфер отправки сокета на уровне операционной системы для данного соединения.
null означает, что данные были записаны в буфер отправки приложения для данного соединения и ожидают записи в системный буфер сокета.
false означает, что отправка не удалась. Причины ошибки могут быть связаны с тем, что клиентское соединение было закрыто, или буфер отправки приложения для данного соединения переполнен.
Внимание
send возвращает true, что означает, что данные были успешно записаны в буфер отправки сокета на уровне операционной системы для данного соединения. Это не означает, что данные были успешно отправлены в буфер получения сокета на другой стороне, и тем более это не означает, что приложение на другой стороне прочитало данные из буфера получения локального сокета. Тем не менее, если send не возвращает false, и сеть не разорвана, а клиент принимает данные нормально, то можно считать, что данные почти на 100% будут отправлены на другую сторону.
Данные в буфере отправки сокета отправляются асинхронно к другой стороне операционной системой, и операционная система не предоставляет приложению соответствующий механизм подтверждения, поэтому приложение не может узнать, когда данные из буфера отправки сокета начинают отправляться, и приложение не может узнать, были ли данные из буфера отправки сокета успешно отправлены. По этим причинам Workerman не может напрямую предоставить интерфейс для подтверждения сообщений.
Если бизнес требует гарантировать, что каждое сообщение было получено клиентом, можно внедрить механизм подтверждения на уровне бизнеса. Механизм подтверждения может варьироваться в зависимости от бизнеса, даже для одного и того же бизнеса может существовать множество методов подтверждения.
Например, в системе чата можно использовать такой механизм подтверждения. Каждое сообщение сохраняется в базе данных, каждое сообщение имеет поле "прочитано". Клиент каждое раз, когда получает сообщение, отправляет серверу пакет подтверждения, сервер отмечает соответствующее сообщение как прочитанное. Когда клиент подключается к серверу (чаще всего это происходит при входе пользователя или восстановлении соединения), он проверяет базу данных на наличие непрочитанных сообщений; если такие имеются, сервер отправляет их клиенту, и клиент уведомляет сервер о прочтении. Таким образом, можно гарантировать, что каждое сообщение будет получено другой стороной. Конечно, разработчик также может использовать свою логику подтверждения.
Пример
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)
{
// Автоматически будет вызван \Workerman\Protocols\Websocket::encode для упаковывания данных в формат протокола websocket перед отправкой
$connection->send("hello\n");
};
// Запускаем worker
Worker::runAll();