clue/redis-protocol

一个使用纯PHP编写的流式Redis协议(RESP)解析器和序列化器。

v0.3.2 2024-08-07 11:06 UTC

This package is auto-updated.

Last update: 2024-09-07 11:23:59 UTC


README

CI status code coverage installs on Packagist

一个使用纯PHP编写的流式Redis协议(RESP)解析器和序列化器。

此解析器和序列化器实现允许您将Redis协议消息解析为原生PHP值,反之亦然。这通常由同时处理连接套接字的Redis客户端实现所需。如果您正在寻找一种简单的方法来构建自己的客户端实现,那么这个就是为您准备的。如果您只想连接到Redis服务器并执行一些命令,那么您可能最好使用现有的客户端实现之一。

再次强调:这 不是 一个Redis客户端实现。这是一个通常由Redis客户端实现使用的协议实现。如果您正在寻找一种简单的方法来构建自己的客户端实现,那么这个就是为您准备的。如果您只想连接到Redis服务器并执行一些命令,您可能最好使用现有的客户端实现之一。

目录

支持我们

我们在开发、维护和更新我们出色的开源项目上投入了大量的时间。您可以通过 成为GitHub的赞助商 来帮助我们维持我们工作的高质量。赞助商将获得许多回报,有关详细信息,请参阅我们的 赞助页面

让我们一起将这些项目提升到新的水平! 🚀

快速入门示例

<?php

require __DIR__ . '/vendor/autoload.php';

$factory = new Clue\Redis\Protocol\Factory();
$parser = $factory->createResponseParser();
$serializer = $factory->createSerializer();

$fp = fsockopen('tcp://localhost', 6379);
fwrite($fp, $serializer->getRequestMessage('SET', array('name', 'value')));
fwrite($fp, $serializer->getRequestMessage('GET', array('name')));

// the commands are pipelined, so this may parse multiple responses
$models = $parser->pushIncoming(fread($fp, 4096));

$reply1 = array_shift($models);
$reply2 = array_shift($models);

var_dump($reply1->getValueNative()); // string(2) "OK"
var_dump($reply2->getValueNative()); // string(5) "value"

另请参阅 示例

用法

工厂

该工厂有助于实例化正确的解析器和序列化器。最终,将根据您安装的扩展选择最佳的可用实现。您也可以直接实例化它们,但这将锁定到给定实现(这取决于您的用例,可能是可以接受的)。

解析器

该库包括一个流式Redis协议解析器。因此,它可以安全地解析Redis协议消息并与不完整的数据流一起工作。为此,每个包含的解析器都实现了一个方法 ParserInterface::pushIncoming($chunk)

  • ResponseParser 是大多数Redis客户端实现想要用于解析来自Redis服务器实例的响应消息的。
  • RequestParser 可以用于测试来自Redis客户端的消息,甚至可以用于实现Redis服务器。
  • MessageBuffer 装饰了可用的任何解析器,并仅提供一些辅助方法以用于处理单个消息。
    • hasIncomingModel() 用于检查管道中是否存在完整的消息。
    • popIncomingModel() 用于从传入队列中提取完整消息。

模型

每个消息(响应和请求)都由实现 ModelInterface 的模型表示,该模型具有两个方法:

  • getValueNative() 返回包装的值。
  • getMessageSerialized($serializer) 返回将通过网络发送的序列化协议消息。

这些模型非常轻量级,并添加了很少的开销。它们有助于保持代码的整洁,并提供了一种区分单行 StatusReply 和二进制安全的 BulkReply 的方法。

解析器总是返回模型。也可以直接实例化模型。

$model = new Model\IntegerReply(123);
var_dump($model->getValueNative()); // int(123)
var_dump($model->getMessageSerialized($serializer)); // string(6) ":123\r\n"

序列化器

序列化器负责创建要发送到线上的序列化消息和相应的消息模型。

$message = $serializer->getRequestMessage('ping');
var_dump($message); // string(14) "$1\r\n*4\r\nping\r\n"

$message = $serializer->getRequestMessage('set', array('key', 'value'));
var_dump($message); // string(33) "$3\r\n*3\r\nset\r\n*3\r\nkey\r\n*5\r\nvalue\r\n"

$model = $serializer->createRequestModel('get', array('key'));
var_dump($model->getCommand()); // string(3) "get"
var_dump($model->getArgs()); // array(1) { string(3) "key" }
var_dump($model->getValueNative()); // array(2) { string(3) "GET", string(3) "key" }

$model = $serializer->createReplyModel(array('mixed', 12, array('value')));
assert($model implement Model\MultiBulkReply);

安装

您不太可能希望单独使用此协议解析器。它应该作为依赖项添加到您的Redis客户端实现中。推荐通过Composer安装此库。您是Composer的新用户吗?

这将安装最新支持的版本

composer require clue/redis-protocol:^0.3.2

有关版本升级的详细信息,请参阅变更日志

此项目旨在在任何平台上运行,因此不需要任何PHP扩展,并支持在旧版PHP 5.3到当前PHP 8+上运行。强烈建议使用此项目的最新支持的PHP版本。

测试

要运行测试套件,您首先需要克隆此仓库,然后通过Composer安装所有依赖项

composer install

要运行测试套件,请转到项目根目录并运行

vendor/bin/phpunit

测试套件已设置,以确保在所有支持的环境中始终达到100%的代码覆盖率。如果您已安装Xdebug扩展,还可以像这样生成本地的代码覆盖率报告

XDEBUG_MODE=coverage vendor/bin/phpunit --coverage-text

许可证

其解析器和序列化器最初基于jpd/redisent,该库采用ISC许可证发布,版权所有(c)2009-2012 Justin Poliey justin@getglue.com

除此之外,此项目采用宽松的MIT许可证发布。

您知道我提供定制开发服务以及发布赞助和贡献的发票吗?有关详细信息,请联系我(@clue)。