在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官方文档说明,凑合能用。