首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
reids无法正确读取数据
### 问题描述 redis 无法正确读取出数据,websocket启动后,一分钟内会有1000个用户连接上,前1分钟可以正确读取出数据,是一个json字符串,但是一分钟之后,读取出来的数据是类似 :5814 +OK 这种莫名奇妙的字符串 Redis服务使用的是腾讯云的云redis,但是使用自己安装的redis一样有问题 redis类是用的是thinkphp5.0 的二次封装 Cache类,但是使用最原始的new \redis()一样不行 ### Swoole版本,PHP版本,以及操作系统版本信息 Swoole版本 :4 PHP版本 :7.2 Redis:腾讯云 ### 相关代码 ```php <?php namespace app\swoole\service; use app\outpatient\model\Outpatient; use think\Cache; class Ws { public $server; public $redis; public function __construct() { $this->server = new \Swoole\WebSocket\Server("0.0.0.0", 8881); $this->server->set([ 'daemonize' => 0, //守护进程 // 'reactor_num' => swoole_cpu_num() * 4, //设置启动的 Reactor 线程数 // 'worker_num' => swoole_cpu_num() * 1000, //设置启动的 Worker 进程数。 // 'max_connection' => 1000000, //服务器程序,最大允许的连接数 'log_file' => ROOT_PATH . 'websocket_log', // 'log_rotation' => SWOOLE_LOG_ROTATION_HOURLY, //设置 Server 日志分割 'heartbeat_idle_time' => 600, // 表示一个连接如果600秒内未向服务器发送任何数据,此连接将被强制关闭 'heartbeat_check_interval' => 60, // 表示每60秒遍历一次 'task_worker_num' => 1, // 表示每60秒遍历一次 ]); //建立连接 $this->server->on('open', function (\Swoole\WebSocket\Server $server, $request) { }); //接收消息 $this->server->on('message', function (\Swoole\WebSocket\Server $server, $frame) { $result = $this->redis->get("outpatient:7:info"); dump($result); if (!empty($result)) { return json_decode($result,true); } $outpatientModel = new Outpatient(); $outpatient = $outpatientModel->where('id', 7)->find(); if (empty($outpatient)) { return false; } $outpatient = $outpatient->toArray(); $this->redis->set("outpatient:7:info", json_encode($outpatient), 86400 * 3); }); //断开连接 $this->server->on('close', function (\Swoole\WebSocket\Server $server, $fd) { }); //处理异步任务 $this->server->on('task', function ($serv, $task_id, $from_id, $data) { }); //处理异步任务的结果 $this->server->on('finish', function ($serv, $task_id, $data) { }); $this->server->start(); } } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么?
发布于3年前 · 23 次浏览 · 来自
提问
.
.co
### 问题描述 redis 无法正确读取出数据,websocket启动后,一分钟内会有1000个用户连接上,前1分钟可以正确读取出数据,是一个json字符串,但是一分钟之后,读取出来的数据是类似 :5814 +OK 这种莫名奇妙的字符串 Redis服务使用的是腾讯云的云redis,但是使用自己安装的redis一样有问题 redis类是用的是thinkphp5.0 的二次封装 Cache类,但是使用最原始的new \redis()一样不行 ### Swoole版本,PHP版本,以及操作系统版本信息 Swoole版本 :4 PHP版本 :7.2 Redis:腾讯云 ### 相关代码 ```php <?php namespace app\swoole\service; use app\outpatient\model\Outpatient; use think\Cache; class Ws { public $server; public $redis; public function __construct() { $this->server = new \Swoole\WebSocket\Server("0.0.0.0", 8881); $this->server->set([ 'daemonize' => 0, //守护进程 // 'reactor_num' => swoole_cpu_num() * 4, //设置启动的 Reactor 线程数 // 'worker_num' => swoole_cpu_num() * 1000, //设置启动的 Worker 进程数。 // 'max_connection' => 1000000, //服务器程序,最大允许的连接数 'log_file' => ROOT_PATH . 'websocket_log', // 'log_rotation' => SWOOLE_LOG_ROTATION_HOURLY, //设置 Server 日志分割 'heartbeat_idle_time' => 600, // 表示一个连接如果600秒内未向服务器发送任何数据,此连接将被强制关闭 'heartbeat_check_interval' => 60, // 表示每60秒遍历一次 'task_worker_num' => 1, // 表示每60秒遍历一次 ]); //建立连接 $this->server->on('open', function (\Swoole\WebSocket\Server $server, $request) { }); //接收消息 $this->server->on('message', function (\Swoole\WebSocket\Server $server, $frame) { $result = $this->redis->get("outpatient:7:info"); dump($result); if (!empty($result)) { return json_decode($result,true); } $outpatientModel = new Outpatient(); $outpatient = $outpatientModel->where('id', 7)->find(); if (empty($outpatient)) { return false; } $outpatient = $outpatient->toArray(); $this->redis->set("outpatient:7:info", json_encode($outpatient), 86400 * 3); }); //断开连接 $this->server->on('close', function (\Swoole\WebSocket\Server $server, $fd) { }); //处理异步任务 $this->server->on('task', function ($serv, $task_id, $from_id, $data) { }); //处理异步任务的结果 $this->server->on('finish', function ($serv, $task_id, $data) { }); $this->server->start(); } } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么?
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2021-07-11
.
.co
$this->redis = new Cache();
赞
0
回复
2021-07-13
R
Ray
redis 需要在 onworkerstart创建 https://wiki.swoole.com/#/server/events?id=onworkerstart
赞
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一直是同一个。没用使用到多进程啊。