Hprose\Swoole\Socket\Service::getOnReceive PHP Метод

getOnReceive() публичный Метод

public getOnReceive ( )
    public function getOnReceive()
    {
        $self = $this;
        $bytes = '';
        $headerLength = 4;
        $dataLength = -1;
        $id = null;
        return function ($server, $socket, $fromid, $data) use($self, &$bytes, &$headerLength, &$dataLength, &$id) {
            $bytes .= $data;
            while (true) {
                $length = strlen($bytes);
                if ($dataLength < 0 && $length >= $headerLength) {
                    list(, $dataLength) = unpack('N', substr($bytes, 0, 4));
                    if (($dataLength & 0x80000000) !== 0) {
                        $dataLength &= 0x7fffffff;
                        $headerLength = 8;
                    }
                }
                if ($headerLength === 8 && $id === null && $length >= $headerLength) {
                    list(, $id) = unpack('N', substr($bytes, 4, 4));
                }
                if ($dataLength >= 0 && $length - $headerLength >= $dataLength) {
                    $context = new stdClass();
                    $context->server = $server;
                    $context->socket = $socket;
                    $context->fd = $socket;
                    $context->fromid = $fromid;
                    $context->userdata = new stdClass();
                    $data = substr($bytes, $headerLength, $dataLength);
                    $self->userFatalErrorHandler = function ($error) use($self, $server, $socket, $id, $context) {
                        $self->socketSend($server, $socket, $self->endError($error, $context), $id);
                    };
                    $self->defaultHandle($data, $context)->then(function ($data) use($self, $server, $socket, $id) {
                        $self->socketSend($server, $socket, $data, $id);
                    });
                    $bytes = substr($bytes, $headerLength + $dataLength);
                    $id = null;
                    $headerLength = 4;
                    $dataLength = -1;
                } else {
                    break;
                }
            }
        };
    }