phpredis subscribe超时问题及解决
来源:互联网 发布:php抓取百度搜索结果 编辑:程序博客网 时间:2024/06/05 22:43
问题描述
redis提供了pub/sub功能,但在使用phpredis的subscribe时发现这样一个问题,代码如下(sub.php):
<?php/*监听demo频道,打印收到的信息*/function process($redis, $chan, $msg){ var_dump($msg);}$redis = new Redis();$res = $redis->connect('127.0.0.1', '7979');$redis->subscribe(array('demo'), 'process');
代码运行后,发现如果在一段时间内未收到来自demo频道的消息,则会报如下错误:
PHP Fatal error: Uncaught exception 'RedisException' with message 'read error on connection' in sub.php:11Stack trace:#0 /search/ballqiu/sub.php(11): Redis->subscribe(Array, 'process')#1 {main} thrown in sub.php on line 11
原因分析
为了查找原因,我们使用strace对代码进行了跟踪:
strace php sub.php
截取部分重要输出如下:
//连接redisconnect(3, {sa_family=AF_INET, sin_port=htons(7979), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)//发送subscribe命令sendto(3, "subscribe demo\r\n", 17, MSG_DONTWAIT, NULL, 0) = 17//收到响应recvfrom(3, "*3\r\n$9\r\nsubscribe\r\n$4\r\ndemo\r\n:1\r"..., 8192, MSG_DONTWAIT, NULL, NULL) = 33poll([{fd=3, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)//套机字超时时间设为60spoll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 0 (Timeout)//等待超时,关闭连接close(3) = 0//输出错误信息write(2, "PHP Fatal error: Uncaught excep"..., 261PHP Fatal error: Uncaught exception 'RedisException' with message 'read error on connection'
可见报错的本质是poll设置接收超时所致,从starce结果我们知道这个超时默认是60s。
解决
我们有两种方法改变超时
- 方法1
在代码起始处设置
ini_set('default_socket_timeout', -1);
- 方法2
在redis connect后执行
$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);
两种方法中的-1均表示永不超时,你也可以将超时设置为自己希望的时间。
无论使用哪种方法,再次strace, 你会发现poll的超时被设为了-1。
recvfrom(3, "*3\r\n$9\r\nsubscribe\r\n$4\r\ndemo\r\n:1\r"..., 8192, 0, NULL, NULL) = 33poll([{fd=3, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)//超时被设为-1, 即永不超时poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, -1
个人比较推荐方法2,它只影响到redis本身。而方法1会对其它方法产生影响,比如
file_get_contents等。
总结
使用phpredis的subscribe时,默认60内没有收到消息,sub端就会因超时异常退出。可以自行设置延长超时时间或永不超时。
1 0
- phpredis subscribe超时问题及解决
- WebClient的超时问题及解决
- WebClient的超时问题及解决
- WebClient的超时问题及解决
- WebClient的超时问题及解决
- AsyncTask超时问题分析及解决
- AjaxPro实现异步调用,解决浏览器假死及超时问题
- 解决PHP超时问题
- 解决数据库超时问题
- phpredis---pub/sub订阅超时
- 解决MySQL5数据库连接超时问题
- 解决xhsell登录超时问题
- 解决MySql数据库连接超时问题
- 解决mysql数据库连接超时问题
- 解决pip超时的问题
- redis安装及phpredis
- 压测系统交易出现响应超时性能问题分析及解决。
- 应用多线程:解决等待超时问题
- C++(面向对象程序设计)
- TCP学习:抓包分析(1)
- Spanner vs. F1:谷歌两大数据管理利器的整体对比及关联 2016-05-22 20:36 757人阅读 评论(0) 收藏 举报 目录(?)[+] http://www.csdn.net/a
- PHP FastCGI进程管理器PHP-FPM的架构
- MyEclipse(2014) 出现从svn检出项目项目后source folder 以文件夹的方式组织的解决方法
- phpredis subscribe超时问题及解决
- iOS APP
- “骑驴找马”很心虚?四大困惑一起解决!
- 基于应用层自身反远程线程注入的研究
- jni简介及openSSL静态动态编译
- 最小K个数
- php mysql 应用操作数据库实例
- 如何简洁快速的在Word 2016中给公式自动编号
- Maven修改本地仓库地址