当前位置:首页 > PHP > 正文内容

php redis断线重连

高老师6年前 (2021-03-16)PHP2065

在cli下运行消费数据,需要保持redis断线重连,虽然redis可以直接传递参数长连接,但是如果redis服务器异常关闭后再重启则需要重启php脚本,比较麻烦,所以写了一个redis断线重连简单版。

<?php

class PRedis
{
    /**
     * options
     * @var array
     */
    protected $options = ['host' => '127.0.0.1', 'port' => 6379, 'password' => '', 'select' => 0, 'timeout' => 0, 'expire' => 0, 'persistent' => false, 'prefix' => ''];

    /**
     * handler
     * @var null
     */
    protected $handler = null;

    /**
     * Redis constructor.
     * @param array $options
     * @throws Exception
     */
    public function __construct($options = [])
    {
        $this->options = array_merge($this->options, $options);
        $this->connect(false);
    }

    /**
     * connect
     * @param $throw
     * @throws RedisException
     */
    protected function connect($throw = true)
    {
        try {
            $this->handler = new \Redis();
            if ($this->options['persistent']) {
                $this->handler->pconnect($this->options['host'], $this->options['port'], $this->options['timeout'], 'persistent_id_' . $this->options['select']);
            } else {
                $this->handler->connect($this->options['host'], $this->options['port'], $this->options['timeout']);
            }
            if ('' != $this->options['password']) {
                $this->handler->auth($this->options['password']);
            }
            if (0 != $this->options['select']) {
                $this->handler->select($this->options['select']);
            }
        } catch (\RedisException$exception) {
            if ($throw) {
                throw $exception;
            }

        }
    }

    /**
     * __call
     * @param $name
     * @param $args
     * @return mixed
     * @throws
     */
    public function __call($name, $args)
    {
        try {
            set_error_handler(function ($errno, $errStr) {
                restore_error_handler();
                throw new RedisException($errStr, $errno);
            });

            return $this->handler->{$name}(...$args);
        } catch (\RedisException$exception) {
            echo "断线重连:" . $exception->getMessage() . PHP_EOL;
            $this->connect(false);
            return false;
        }
    }
}

$redis = new PRedis();
$redisKey = 'key';
while (true) {
    //set
    $redis->set($redisKey, rand(1, 99));

    //get
    $value = $redis->get($redisKey);
    if ($value) {
        echo $value . PHP_EOL;
    }

    //sleep
    sleep(1);
}

可以在断线重连异常中适当ping()来决定是否真正去连接,并且建议增加间隔多久连接一次。tp中mysql的断线重连是依赖于错误信息的关键字,或许在redis中断线重连也可以参考,毕竟异常不一定都是redis断开连接,可以从异常信息中提取关键字来精确分析,当然ping一下更简单。也没有来得及去看redis官方文档说明,凑合能用。

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/196.html

分享给朋友:

“php redis断线重连” 的相关文章

 php mysql 行锁,php mysql 行级锁,php mysql 行锁定

php mysql 行锁,php mysql 行级锁,php mysql 行锁定

应用场景:PHP模拟购买,商品数量大于0才能购买常见代码:<?php //连接数据库 $con=mysqli_connect("localhost","ihuohuo","927464cy","ihuohuo");...

redis订阅和发布,redis消息订阅与发布, phpredis订阅和发布

redis订阅和发布,redis消息订阅与发布, phpredis订阅和发布

Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者(publisher),订阅者(subscriber)和频道(channel)。 发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个...

php json_encode 使用注意

php json_encode 使用注意

参数中包含gb2312的字符串,返回结果是false或者null(不同PHP版本具有差异性)代码:<?php $dbms = 'mysql'; $host = '192.168.8.8'; $dbName =&n...

posix_ttyname函数详解

posix_ttyname函数详解

posix_ttyname - 获取当前终端设备名称。<?php     var_dump( posix_ttyname(STDOUT) );我们启动一个终端,执行上面的代码输出:/dev/tty1我们再启动一个终端,执行上面的代码输...

php迭代器返回值,php yield getReturn

php迭代器返回值,php yield getReturn

php生成器的方法getReturn获取生成器迭代完成后的返回值,当生成器迭代完成会将生成器的返回值返回,因此如果迭代器未进行迭代是获取不到值的,如果你没有return值则返回null,参考代码:<?php function G1() {    &nbs...

php位运算符详解

php位运算符详解

文章篇幅较长,如果不喜欢看文章的,此处抛出韩顺丰老师的位运算视频,韩老师应该是全网讲php位运算符最详细的一个老师了。链接:https://pan.baidu.com/s/14xj7er8eVSUcJ-jYXyA0GA  提取码:731m 链接:https://pan.baidu.com...