首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
swoole使用redis缓存 进程异常重启
### 问题描述 使用swoole的协程redis bitmap缓存大量id,批量缓存最多一次大约不到20w个id,缓存一个13w之后 worker进程异常重启 ### Swoole版本,PHP版本,以及操作系统版本信息 php 7.21 swoole 4.0.0-rc1 ### 相关代码 ```php /** * @批量缓存id偏移量 * @param $key * @param $ids * @param int $expire * @return mixed */ public static function setBitMap($key, $ids, $expire = 0) { $redis = self::getCkvPlusConnection()->getCkv(); if (!$redis instanceof \Swoole\Coroutine\Redis) { return CommonUtil::make_ret(CommError::$EC_ENV_ERROR_VALUE, ['msg' => $redis['msg'] ?: 'ckv+ connected failed']); } //先清空 $redis->del(self::getKey($key)); $redis->multi(SWOOLE_REDIS_MODE_PIPELINE); if ($ids && is_array($ids)){ foreach ($ids as $id) { $redis->setBit(self::getKey($key), (string)$id, 1); } } if ($expire > 0) { $redis->expire(self::getKey($key), $expire); } $redis->exec(); $redis->close(); return CommonUtil::make_suc(); } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 报错的告警信息 async.c:463: redisProcessCallbacks: Assertion `(c->flags & 0x20 || c->flags & 0x40)' failed. [2020-10-21 15:01:59 $16898.0] WARNING swManager_check_exit_status: worker#4 abnormal exit, status=0, signal=6
发布于4年前 · 5 次浏览 · 来自
提问
leviosachen
### 问题描述 使用swoole的协程redis bitmap缓存大量id,批量缓存最多一次大约不到20w个id,缓存一个13w之后 worker进程异常重启 ### Swoole版本,PHP版本,以及操作系统版本信息 php 7.21 swoole 4.0.0-rc1 ### 相关代码 ```php /** * @批量缓存id偏移量 * @param $key * @param $ids * @param int $expire * @return mixed */ public static function setBitMap($key, $ids, $expire = 0) { $redis = self::getCkvPlusConnection()->getCkv(); if (!$redis instanceof \Swoole\Coroutine\Redis) { return CommonUtil::make_ret(CommError::$EC_ENV_ERROR_VALUE, ['msg' => $redis['msg'] ?: 'ckv+ connected failed']); } //先清空 $redis->del(self::getKey($key)); $redis->multi(SWOOLE_REDIS_MODE_PIPELINE); if ($ids && is_array($ids)){ foreach ($ids as $id) { $redis->setBit(self::getKey($key), (string)$id, 1); } } if ($expire > 0) { $redis->expire(self::getKey($key), $expire); } $redis->exec(); $redis->close(); return CommonUtil::make_suc(); } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 报错的告警信息 async.c:463: redisProcessCallbacks: Assertion `(c->flags & 0x20 || c->flags & 0x40)' failed. [2020-10-21 15:01:59 $16898.0] WARNING swManager_check_exit_status: worker#4 abnormal exit, status=0, signal=6
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2020-10-22
鲁飞
升级下版本吧,4.0.0太低了
赞
0
回复
2020-10-23
leviosachen
最后定位到的问题是: swoole的协程redis事务里面最多能执行65536条指令,超过这个数量就会告警,导致worker进程中断; 这里循环去写本来就是好的办法,后续用$redis->request($redis_param); bitField 批量一次性写入,时间消耗可以忽略;也没有报错;
赞
0
回复
微信公众号
热门内容
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。