seregazhuk / react-memcached
基于ReactPHP的异步Memcached客户端实现
Requires
- php: >=7.2
- evenement/evenement: 3
- react/event-loop: ^1.0
- react/promise: ^2.7
- react/socket: ^1.0
Requires (Dev)
- codeclimate/php-test-reporter: ^0.4.4
- mockery/mockery: ^1.0
- phpunit/phpunit: ~7.0
- seregazhuk/react-promise-testing: 0.*
README
ReactPHP生态系统中的异步Memcached PHP客户端。
目录
安装
依赖
库需要PHP 5.6.0或更高版本。
安装此库的推荐方式是通过Composer。 对Composer不熟悉?
有关版本升级的详细信息,请参阅变更日志。
composer require seregazhuk/react-memcached
快速开始
require '../vendor/autoload.php'; use seregazhuk\React\Memcached\Factory; $loop = React\EventLoop\Factory::create(); $client = Factory::createClient($loop); $client->set('example', 'Hello world'); $client->get('example')->then(function ($data) { echo $data . PHP_EOL; // Hello world }); // Close the connection when all requests are resolved $client->end(); $loop->run();
请参阅其他示例。
服务器地址
通过工厂创建客户端时,您可以将服务器地址指定为第二个参数
$client = Factory::createClient($loop, 'localhost:11222');
如果没有指定地址,则客户端使用默认的localhost:11211
。
异步执行
对于每个Memcached命令,客户端都有一个方法。所有命令都是异步执行的。客户端存储挂起的请求,一旦它从服务器接收到响应,它就开始解析这些请求。这意味着每个命令都返回一个承诺。当服务器执行命令并返回响应时,承诺将用此响应解决。如果发生错误,承诺将被拒绝。
检索命令
获取
通过键获取值
$client ->get('some-key') ->then(function ($data) { echo "Retreived value: " . $data . PHP_EOL; });
存储命令
对于$flags
,您可以使用PHP MEMCACHE_COMPRESSED
常量来指定即时压缩。如果值未存储,因为条件不满足add
或replace
命令,或者项在删除队列中,承诺将被拒绝,并抛出FailedCommandException
。
设置
将键值对存储在Memcached中
$client ->set('some-key', 'my-data') ->then(function () { echo "Value was stored" . PHP_EOL; }); // advanced: with compression and expires in 30 seconds $client ->set('some-key', 'my-data', MEMCACHE_COMPRESSED, 30) ->then(function () { echo "Value was stored" . PHP_EOL; });
添加
将键值对存储在Memcached中,但前提是服务器尚未为该键存储数据
$client ->add('name', 'test') ->then(function() { echo "The value was added" . PHP_EOL; }); // advanced: with compression and expires in 30 seconds $client ->add('name', 'test', MEMCACHE_COMPRESSED, 30) ->then(function() { echo "The value was added" . PHP_EOL; });
替换
将键值对存储在Memcached中,但前提是服务器已为该键存储数据
$client ->replace('name', 'test') ->then(function(){ echo "The value was replaced" . PHP_EOL; }); // advanced $client ->replace('name', 'test', $flags, $exptime) ->then(function(){ echo "The value was replaced" . PHP_EOL; });
删除命令
通过键从Memcached中删除值。如果键不存在或已被删除,承诺将拒绝并抛出FailedCommandException
$client ->delete('name') ->then(function(){ echo "The value was deleted" . PHP_EOL; });
自增/自减命令
自增
在Memcached中与键关联的自增值,项目必须存在,自增命令不会创建它。自增的限制是64位标记。如果找不到键,承诺将拒绝并抛出FailedCommandException
$client ->incr('var', 2) ->then( function($data){ echo "New value is: " . $data . PHP_EOL; }, function(FailedCommandException $e) { echo "Key not found" . PHP_EOL; });
自减
在Memcached中与键关联的自减值,项目必须存在,自减命令不会创建它。如果您尝试将值减少到0以下,则值将保持为0。如果找不到键,承诺将拒绝并抛出FailedCommandException
$client ->decr('var', 2) ->then( function($data){ echo "New value is: " . $data . PHP_EOL; }, function(FailedCommandException $e) { echo "Key not found" . PHP_EOL; });
如果找不到值,承诺将拒绝并抛出FailedCommandException
。
触摸命令
使用 touch 命令可以更新现有项目的过期时间而不获取它。如果键不存在或已被删除,则使用 FailedCommandException
拒绝承诺
$client ->touch('var', $exp) ->then( function($data){ echo "The value was toched". PHP_EOL; }, function(FailedCommandException $e) { echo "Key not found" . PHP_EOL; });
统计命令
此命令可以返回各种统计信息的数组
$client ->stats() ->then(function($result){ print_r($result); /* Array ( [pid] => 666 [uptime] => 180660 [time] => 1508342532 ... [lru_bumps_dropped] => 0 ) */ });
其他命令
清除所有
在可选的 [] 期间后刷新服务器键/值对(使它们无效)
$client ->flushAll() ->then(function() { echo "Everything was flushed" . PHP_EOL; });
版本
返回 Memcached 服务器的版本
$client ->version() ->then(function($result) { echo "Memcached version: $result" . PHP_EOL; // Memcached version: 1.5.0 });
详细程度
更改 Memcached 服务器的详细输出
$client ->verbosity(2) ->then(function($result) { echo "Verbosity was changed to 2" . PHP_EOL; });
连接关闭
End()
要关闭连接,请在客户端调用 end()
方法。客户端将等待所有挂起的请求解决,然后关闭连接。所有新请求到客户端都将被 ConnectionClosedException
异常拒绝。
Close()
如果您想强制关闭而不等待挂起的请求解决,请调用 close()
方法。它将立即关闭连接,并使用 ConnectionClosedException
异常拒绝所有挂起的请求。
事件处理
您可以注册事件处理程序以处理客户端的一些事件。
close
当与 Memcached 服务器的连接关闭时,会触发 close
事件。您可以监听此事件以捕获连接故障
$client->on('close', function () { // handle closed connection });
error
当连接发生错误时,客户端会触发 error
事件,并传递包含问题描述的异常
$client->on('error', function (Exception $e) { // handle error });
例如,您可以这样处理断开的连接
$client->on('error', function (ConnectionClosedException $e) { // handle broken connection });
错误处理
客户端抛出的所有异常或用于拒绝承诺的异常都扩展自基本 seregazhuk\React\Memcached\Exception\Exception
类。
例如,如果您调用了一个未知的 Memcached 命令,则承诺将被 WrongCommandException
拒绝
$client ->unknown() ->then('var_dump', function(WrongCommandException $e){ echo $e->getMessage() . PHP_EOL; // Unknown command: unknown });
当连接断开时,所有挂起的承诺都将使用 ConnectionClosedException
异常拒绝。