这次给大家带来php使用redis长连接有哪些步骤,php使用redis长连接的注意事项有哪些,下面就是实战案例,一起来看一下。

php-redis在github上的项目地址:https://github.com/phpredis/phpredis

pconnect函数声明

其中time_out表示客户端闲置多少秒后,就断开连接。函数连接成功返回true,失败返回false:pconnect(host, port, time_out, persistent_id, retry_interval)

host: string. can be a host, or the path to a unix domain socket

port: int, optional

timeout: float, value in seconds (optional, default is 0 meaning unlimited)

persistent_id: string. identity for the requested persistent connection

retry_interval: int, value in milliseconds (optional)

下面的例子详细介绍了pconnect连接的重用情况。$redis->pconnect('127.0.0.1', 6379);

$redis->pconnect('127.0.0.1'); // 默认端口6379,跟上面的例子使用相同的连接。

$redis->pconnect('127.0.0.1', 6379, 2.5); // 设置了2.5秒的过期时间。将是不同于上面的新连接

$redis->pconnect('127.0.0.1', 6379, 2.5, 'x'); //设置了持久连接的id,将是不同于上面的新连接

$redis->pconnect('/tmp/redis.sock'); // unix domain socket - would be another connection than the four before.

pconnect使用介绍

对pconnect方法简单描述

使用该方法创建连接,连接不会在调用close方法之后关闭,只有在进程结束之后该连接才会被关闭。

[待验证]如果使用的是长连接,Redis配置文件中的timeout配置项需要设置为0,否则连接池中的连接会因为超时而失效

针对PHP-FPM来说明一下pconnect

长连接只会在PHP-FPM进程结束之后结束,连接的生命周期就是PHP-FPM进程的生命周期。

相比较短连接而言,在每一个PHP-FPM调用过程中都会产生一个redis的连接,在服务器上的表性形式就是过多的time_out连接状态。

而长连接相反,PHP-FPM调用的所有CGI都只会共用一个长连接,所以也就是只会产生固定数量的time_out。

关闭长连接

可以调用close和unset方法,但两则差异很大:

- close的作用仅仅是使当前PHP进程不能再进行redis请求,但无法真正关闭redis长连接,连接在后续请求中仍然会被重用,直FPM进程生命周期结束。所以close 并不会销毁redis对象,只是断开连接而已。

- unset变量才会销毁。也需要注意并不是使用了 pconnect 就不要 close 了,如果当前脚本执行时间很长 那么也会一直占用一个连接的。

如何判断当前Redis是否处于连接状态

等效的问题是,在单例模式中,判断当前实例是否有效。

习惯上调用echo,判断是否正常返回字符串本身,或者调用ping,查看返回值是否为 +PONG。

但是需要特别小心的是,在redis断开连接之后,调用echo以及ping(返回'+POMG')时,均会抛出异常。所以要通过异常捕获机制来处理。

代码分析pconnect连接重用的问题

情况一:非单例模式。

说明:a实例和b实例共用了一条连接,b实例将a实例的连接修改了:

所以下面的例子导致最终$a实例得到的值变成了2,需要特别注意。$a = pconnect(host, port, time_out);

select(3);

$a -> setex(id, 3);

echo $a -> get(id);

//之后执行下面的连接

$b = pconnect(host, port, time_out);

select(2);

$b->set(id,2)

echo $a->get(id); //这个id操作的db变成了2,不再是之前的3了。因为这两个连接共用了一个连接通道。

情况二:单例模式。

将上述的代码修改,a和b都通过getInstance来生成。生成的前提是判断当前实例是否存在。单例模式的混淆点在于:

$a生成了一个实例,这时候生成$b, $b使用了$a的实例,然后修改了$a的连接,之后调用$a肯定是调用的$b修改之后的实例。跟情况二一致。

单例模式的代码如下:public static function getInstance($db = 0)

{

if (!isset(self::$_instance)) {

self::$_instance = new Redis();

}

self::_connect();

self::$_instance->select($db);

return self::$_instance;

}

两种情况都说明了连接重用的问题。如何修复这个bug?两点:

1.为每一个db生成一个单例。

2.避免连接重用问题。

所以代码可以做调整为返回一个单例数组:public static function getInstance($db = 0)

{

try{

if (isset(self::$_instance[$db]) && self::$_instance[$db]->Ping() == 'Pong') {

return self::$_instance[$db];

}

} catch (Exception $e) {

}

self::$_instance[$db] = new Redis();

self::_connect($db);

return self::$_instance[$db];

}

需要注意的地方

避免在Task类成员变量中使用redis对象。

在redis的单例模式中,声明了time_out的过期时间。如果redis处理的场合是一个任务,而任务调用redis间隔时间又比较长。当间隔大于time_out时候,redis就会断开连接,这时候所有对redis的操作都会失效。解决的办法就是避免这种调用方式,通过在调用的地方动态声明redis类来执行。这种问题对于长连接和短链接是没有区分,属于调用的方式错误。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

php7 redis长连接,php使用redis长连接有哪些步骤相关推荐

  1. SpringBoot中实现连接多个Redis分别读写数据

    场景 在SpringBoot项目中需要连接两个Redis实例,并实现从A中获取数据并存取到B中. 另外A中redis的地址和密码不能外漏,则将A的地址和密码写在jar包中,B中redis参数可以在外置 ...

  2. C/C++编程操作Redis数据库,hiredis包装redis数据库操作接口及测试(增删改查与连接)

    介绍一个实际应用场景,对于客户频繁需要查询的信息,可以将其放在redis内存数据库中,相当于一个缓存,每次查的时候先去redis内存数据库中去查询,如果查询不到再去oracle数据库中查询,这样提高了 ...

  3. redis服务端的maxclient和最大连接空闲时间设置

    1.redis服务器可以配置最大允许的客户端连接数,当大于设置的值时,连接被拒绝,可以通过cluster info clients查看拒绝连接数,占用最大输入缓冲区的客户端连接,占用最大输出缓冲区的客 ...

  4. springboot2整合redis使用lettuce连接池(解决lettuce连接池无效问题)

    lettuce客户端 Lettuce 和 Jedis 的都是连接Redis Server的客户端程序.Jedis在实现上是直连redis server,多线程环境下非线程安全(即多个线程对一个连接实例 ...

  5. redis:redis介绍和安装、普通连接和连接池、redis 5大数据类型之字符串、Hash、列表、其他操作(通用)、管道、django使用redis、接口缓存

    目录 一. redis介绍和安装 二. 普通连接和连接池 三. redis 5大数据类型之字符串 四. redis 5大数据类型之Hash 五. redis 5大数据类型之列表 六. 其他操作(通用) ...

  6. Redis 笔记(01)— 安装、启动配置、开启远程连接、设置密码、远程连接

    1. Redis 简介 1月份将 <Redis入门指南>过了一遍,现将 Redis 五大类型的常用命令做一总结,留着后续备用. Redis 是 RemoteDictionary Serve ...

  7. java redis释放连接池_Java 使用连接池操作redis

    构建连接池对象JedisPool JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379); ...

  8. R语言配对图可视化:pivot_longer函数将宽格式的数据重塑为长格式并进行数据全连接和左连接(left join)、配对图可视化(根据分类变量的值为散点图上的数据点添加颜色)

    R语言配对图可视化:pivot_longer函数将宽格式的数据重塑为长格式并进行数据全连接和左连接(left join).配对图可视化(根据分类变量的值为散点图上的数据点添加颜色,Add color ...

  9. 本地window cmd 远程连接外网redis

    2019独角兽企业重金招聘Python工程师标准>>> 要点 1.确认本地windows要安装redis 2.确认在服务器上安装redis时,将绑定的本机给注释掉了 vi redis ...

最新文章

  1. 云原生思想 — 云原生的微服务架构
  2. mongodb 导出到sqlserver_迁移sqlserver数据到MongoDb的方法
  3. MyBatisPlus中进行通用CRUD全局策略配置
  4. 算法 | 最速降线问题与最小旋转面问题(变分法)
  5. P3292 [SCOI2016]幸运数字(树剖 + 线段树维护线性基)
  6. 离婚从来不是解决家庭危机的唯一办法
  7. HTTP之Cookie和Session(C++ Qt框架实现)
  8. C++折半查找的实现
  9. 公司内网机器vm ubuntu proxy 设置
  10. UIAlertView使用全解
  11. 3.黑客常用端口利用总结
  12. 【最优化】最优化理论的基本概念
  13. wordpress iDowns-v1.8.3下载类主题无缝对接erphpdown会员中心+在线充值+VIP开通+卡密插件
  14. 基于航天宏图PIE-SAR软件的高分三号(GF-3)SAR影像的预处理
  15. k_fold_cv函数——bartMachine包内函数详解
  16. php如何做拆弹,拆弹有多难?千万别被《拆弹专家2》给骗了,不可能遇到这种炸弹...
  17. English学习经典视频
  18. 企业邮箱登录入口有哪些?公司邮箱账号怎么登陆更方便
  19. 解决使用Java CV导致物理内存过高问题
  20. c语言从键盘输入一个百分制成绩score,C语言 基础练习40题

热门文章

  1. 项目编译失败_Swift源码编译让底层更清晰
  2. CTF-PWN环境搭建
  3. oracle如何查询系统变量数据,Oracle如何对IN子查询使用绑定变量(转)
  4. python函数定义与使用
  5. python三目运算和递归的小练习
  6. python 文件不存在时才能写入,读写模式xt
  7. MongoDB同步到Oracle,MongoToOracleMongoDB数据库迁移工具
  8. http中的净荷 payload(有效载荷、有效负载)是什么?
  9. (深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)(C/C++存储类型总结)(内存管理)
  10. 震惊!html文件注释也会影响运行代码!(werkzeug.routing.BuildError: Could not build url for endpoint)莫名其妙