广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php之redis短线重连的示例分析
  • 930
分享到

php之redis短线重连的示例分析

2023-06-20 20:06:50 930人浏览 八月长安
摘要

这篇文章主要介绍了PHP之redis短线重连的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php Redis断线重连,pconnect连接失败问题介绍在swoole

这篇文章主要介绍了PHPredis短线重连的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

php Redis断线重连,pconnect连接失败问题

介绍

在swoole ,workerman等cli长连接模式下,遇到Redis异常断开,后面又开启的情况,一般得重新启动程序才能正常使用,

本文介绍在不重启服务,实现原来的Redis断线重连

原理

Redis 断开的情况下调用

$Redis->ping()会触发Notice错误,Notice: Redis::ping(): send of 14 bytes failed with errno=10054

当获取redis实例时,如果ping不通或者出现异常,就重新连接

实现1

因为try catch  捕捉不到notice异常,所以ping不通直接重新连接,catch捕捉新连接的实例没有连接上,下次执行ping触发

Redis server went away 异常
public static function getInstance( )    {        try {            if (!self::$_instance) {                new self();            } else {                if (!self::$_instance->ping())                    new self();            }        } catch (\Exception $e) {            // 断线重连            new self();        }        return self::$_instance;    }

实现2

调用ping之前先抛出个notice异常,

调用ping

用error_get_last获取最后一个错误,如果错误信息跟我们抛出的一样,说明ping通了,否则抛出个异常 ,让catch捕捉到执行重连,

当重连一次没连上再次调用$_instance->ping()会直接抛出Redis server went away异常让catch捕捉到

public static function getInstance( )    {        if (!self::$_instance) {            new self();        }        else{            try {                @trigger_error('flag', E_USER_NOTICE);                self::$_instance->ping();                $error = error_get_last();                if($error['message'] != 'flag')                    throw new \Exception('Redis server went away');            } catch (\Exception $e) {                // 断线重连                new self();            }        }        return self::$_instance;    }

Redis类完整代码

<?php  namespace lib;  class Redis{     private static $_instance; //存储对象    private function __construct( ){        $config = Config::get('redis');        self::$_instance = new \Redis();        //从配置读取        self::$_instance->pconnect($config['host'], $config['port']);        if ('' != $config['passWord']) {            self::$_instance->auth($config['password']);        }     }        public static function getInstance( )    {        if (!self::$_instance) {            new self();        }        else{            try {                @trigger_error('flag', E_USER_NOTICE);                self::$_instance->ping();                $error = error_get_last();                if($error['message'] != 'flag')                    throw new \Exception('Redis server went away');            } catch (\Exception $e) {                // 断线重连                new self();            }        }        return self::$_instance;    } //    public static function getInstance( )//    {//        try {//            if (!self::$_instance) {//                new self();//            } else {//                if (!self::$_instance->ping())//                    new self();//            }//        } catch (\Exception $e) {//            // 断线重连//            new self();//        }//        return self::$_instance;//    }           private function __clone(){}         public function __call($method,$args)    {        return call_user_func_array([self::$_instance, $method], $args);    }         public static function __callStatic($method,$args)    {        self::getInstance();        return call_user_func_array([self::$_instance, $method], $args);    }   }

调用

$this->handler = Redis::getInstance();        $key    = $this->getCacheKey($name);        $value = $this->handler->get($key);

补充

pconnect建立连接后重连失败问题

测试长连接下使用pconnect建立连接后,redis超时被动断开了链接,

$res = self::$_instance->pconnect($config['host'], $config['port']);

$res 会返回true,但不是新建的链接,调用$res-get()会报错

原因

研究发现

使用pconnect,链接在php进程的整个生命周期内被重用, close的作用仅是使当前php不能再进行redis请求,但无法真正关闭redis长连接,连接在后续请求中仍然会被重用,直至fpm进程生命周期结束。

长连接中只有进程被停止,连接才会断开,所以连接断开时new不起作用,返回连接成功,而事实上已经断了,还是最早的那个连接,从而导致不能进行后续读取数据操作

所以长连接中请使用connect

感谢你能够认真阅读完这篇文章,希望小编分享的“php之redis短线重连的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网PHP编程频道,更多相关知识等着你来学习!

--结束END--

本文标题: php之redis短线重连的示例分析

本文链接: https://www.lsjlt.com/news/299802.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • php之redis短线重连的示例分析
    这篇文章主要介绍了php之redis短线重连的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php redis断线重连,pconnect连接失败问题介绍在swoole...
    99+
    2023-06-20
  • php之redis短线重连案例讲解
    php redis断线重连,pconnect连接失败问题 介绍 在swoole ,workerman等cli长连接模式下,遇到Redis异常断开,后面又开启的情况,一般得重新启动程序...
    99+
    2022-11-12
  • Redis中连接错误的示例分析
    这篇文章主要介绍Redis中连接错误的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言最近由于流量增大,redis 出现了一连串错误,比如:LOADING Redis is...
    99+
    2022-10-18
  • SOCKET之多线程的示例分析
    这篇文章主要介绍了SOCKET之多线程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。多线程的原理图:可以理解成成10086的多个客...
    99+
    2022-10-19
  • TypeScript三重斜线指令的示例分析
    这篇文章主要介绍TypeScript三重斜线指令的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言TypeScript是Javascript的超集,实现以面向对象编程的方式...
    99+
    2022-10-19
  • PHP之CI框架的示例分析
    这篇文章将为大家详细讲解有关PHP之CI框架的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言CodeIgniter 是一个简单快速的PHP MVC框架。EllisLab 的工作人员发布了 ...
    99+
    2023-06-20
  • Java基础之线程锁的示例分析
    这篇文章将为大家详细讲解有关Java基础之线程锁的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、 synchronized关键字对象锁a.当使用对象锁的时候,注意要是相同的对象,并且当有线程正...
    99+
    2023-06-20
  • Java多线程之死锁的示例分析
    小编给大家分享一下Java多线程之死锁的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是死锁死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全...
    99+
    2023-05-30
    java
  • Java多线程之Interrupt中断线程的示例分析
    小编给大家分享一下Java多线程之Interrupt中断线程的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、测试代码https://gitee.com/zture/spring-test/blob/master...
    99+
    2023-06-15
  • Android编程之短信列表的时间显示实例分析
    本文实例讲述了Android编程之短信列表的时间显示。分享给大家供大家参考,具体如下: Android的短信的时间的显示做的很精细,首先保存在短信数据库mmssms.db中的短...
    99+
    2022-06-06
    程之 列表 Android
  • C++实现LeetCode之最短子数组求和的示例分析
    这篇文章主要介绍C++实现LeetCode之最短子数组求和的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完![LeetCode] 209. Minimum Size Subarray Sum 最短子数组之和Gi...
    99+
    2023-06-20
  • canvas之绘制路径-线段的示例分析
    小编给大家分享一下canvas之绘制路径-线段的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Canvas绘图环境中有些属于立即绘制图形方法,有些绘图方法...
    99+
    2023-06-09
  • Html5多线程开发之WebWorkers的示例分析
    这篇文章将为大家详细讲解有关Html5多线程开发之WebWorkers的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。我们都知道,浏览器执行js代码是单线程的,当...
    99+
    2022-10-19
  • redis desktop manager安装及连接方式的示例分析
    这篇文章主要介绍了redis desktop manager安装及连接方式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、下载安...
    99+
    2022-10-18
  • Python中线程池模块之多线程的示例分析
    这篇文章将为大家详细讲解有关Python中线程池模块之多线程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、线程池模块引入from concurrent.futures i...
    99+
    2023-06-15
  • Java内存模型之重排序的示例分析
    小编给大家分享一下Java内存模型之重排序的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、数据依赖性如果两个操作访问同一个变量,而且这两个操作中有一个操作为写操作,此时这两个操作之间存在数据依赖性。数据依赖性分...
    99+
    2023-06-15
  • Java并发编程之线程池的示例分析
    这篇文章将为大家详细讲解有关Java并发编程之线程池的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是线程池是一种基于池化思想管理线程的工具。池化技术:池化技术简单点来说,就是提前保存大量的资...
    99+
    2023-06-20
  • Java多线程之线程池七个参数的示例分析
    这篇文章主要介绍Java多线程之线程池七个参数的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!ThreadPoolExecutor是JDK中的线程池实现,这个类实现了一个线程池需要的各个方法,它提供了任务提交...
    99+
    2023-06-14
  • JBuilder2005实现重构之升级到JDK5.0的示例分析
    这篇文章给大家分享的是有关JBuilder2005实现重构之升级到JDK5.0的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。想把Jbuilder X 下的jdk換成 1.6  ,結果出現錯誤,...
    99+
    2023-06-03
  • PHP数据结构-图的应用:最短路径的示例分析
    这篇文章主要介绍了PHP数据结构-图的应用:最短路径的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是最短路径今天我们学习的是图的应用中另外一个经典的问题,也就是...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作