Протоколы и границы сообщений
TCP передаёт поток байтов: один send не обязан соответствовать одному чтению. Codec выделяет сообщения до вызова onMessage.
ProtocolInterface
Заголовок раздела «ProtocolInterface»public static function input(string $buffer, ConnectionInterface $connection): int;public static function decode(string $buffer, ConnectionInterface $connection): mixed;public static function encode(mixed $data, ConnectionInterface $connection): string;input() возвращает 0, пока нельзя определить полный пакет, либо его ожидаемую длину. Transport накапливает байты и вызывает decode после получения пакета. Ограничьте длину до выделения больших буферов; на повреждённое framing возвращайте явную ошибку, а не бесконечное ожидание.
| Codec | Граница сообщения |
|---|---|
| Text | Строка до \n; завершающие CR/LF удаляются |
| Frame | uint32 network order с длиной payload, затем payload |
| Http | HTTP-заголовки, Content-Length/chunked и HTTP-семантика |
| Websocket | Handshake и WebSocket frames |
Frame ограничивает заявленный payload 64 MiB; отдельно действует maxPackageSize соединения. UDP сохраняет границу датаграммы, но не предоставляет TCP-гарантий порядка/доставки.
Собственный codec
Заголовок раздела «Собственный codec»Реализуйте интерфейс и назначьте класс в $server->protocol. В encode формируйте однозначный пакет; в input не считайте неполный заголовок ошибкой. В тестах передавайте одно сообщение по частям и несколько сообщений одним буфером. Raw send обходит encode: используйте его только для уже сформированных wire-данных.