我使用workerman 的 多线程连接redis。
起初几分钟正常
后面的数据就完蛋了
'2017-06-09 23:50:41'
'2017-06-09 23:50:36'
'*8'
'2017-06-09 23:50:46'
'693502000071560'
'2017-06-09 23:50:46'
'2017-06-09 23:50:46'
'*8'
'2017-06-09 23:50:46'
'*8'
'2017-06-09 23:50:46'
'*8'
'2017-06-09 23:50:46'
'*8'PHP Fatal error: Uncaught exception 'RedisException' with message 'protocol error, got 's' as reply type byte
' in /home/wwwroot/Cron/cron/Task/mapRedisCache.php:105
Stack trace:
#0 /home/wwwroot/Cron/cron/Task/mapRedisCache.php(105): Redis->get('MAP_SYSTEM_DATA')
#1 /home/wwwroot/Cron/test.php(24): Cron\Task\mapRedisCache->getRunningTime()
#2 [internal function]: {closure}()
#3 /home/wwwroot/Cron/vendor/workerman/workerman/Events/React/StreamSelectLoop.php(54): call_user_func_array(Object(Closure), Array)
#4 [internal function]: Workerman\Events\React\StreamSelectLoop->Workerman\Events\React\{closure}(Object(React\EventLoop\Timer\Timer))
#5 /home/wwwroot/Cron/vendor/react/event-loop/src/Timer/Timers.php(90): call_user_func(Object(Closure), Object(React\EventLoop\Timer\Timer))
#6 /home/wwwroot/Cron/vendor/react/event-loop/src/StreamSelectLoop.php(177): React\EventLoop\Timer\Timers->tick()
#7 /home/wwwroot/Cron/vendor/workerman/workerman/Events/React/StreamSelectLoop.php(104): React\EventLoop\StreamSelectLoop->run()
#8 /home/w in /home/wwwroot/Cron/cron/Task/mapRedisCache.php on line 105
'2017-06-09 23:50:46'
'693502000071560'
'693502000071560'
'2017-06-09 23:50:51'
'2017-06-09 23:50:51'worker[Write_Data:20799] exit with status 65280
worker[Write_Data:20798] exit with status 65280
彻底的数据乱套了, redis 存的是 2017.... 读出来 一会+0K 一会 *8 一会其他数据
我也遇到此问题,咨询 Workerman 作者,立即得到回复,问题得到解决。解决办法也很简单。
出现此问题的情况一般是在 Workerman::runAll() 调用之前,连接了 Redis,导致 fork 出来的所有子进程都能收到 Redis 返回的数据,所以收到这些“意外数据”导致不是我们想要的结果。