seregazhuk/react-memcached

基于ReactPHP的异步Memcached客户端实现

0.2.1 2018-09-14 19:09 UTC

This package is auto-updated.

Last update: 2024-09-22 22:26:38 UTC


README

ReactPHP Memcached Client

ReactPHP生态系统中的异步Memcached PHP客户端。

Build Status Scrutinizer Code Quality Maintainability Test Coverage StyleCI

目录

安装

依赖

库需要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常量来指定即时压缩。如果值未存储,因为条件不满足addreplace命令,或者项在删除队列中,承诺将被拒绝,并抛出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 异常拒绝。