clue / redis-protocol
一个使用纯PHP编写的流式Redis协议(RESP)解析器和序列化器。
Requires
- php: >=5.3
Requires (Dev)
- phpunit/phpunit: ^9.6 || ^5.7 || ^4.8.36
README
一个使用纯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)。