while 循环读取redis 抛出内存溢出异常 [ 技术分享 ]
请看以下代码,貌似没什么毛病,其实这段代码并不会超时退出循环而是会抛出内存溢出问题,为什么呢? 查看源代码发现Yii每次redis操作都会 在 yii\redis\Connection; 方法executeCommand()里有个\Yii::trace("Executing Redis Command: {$name}", __METHOD__);
每次trace 都会把消息存在变量$this->messages
数组中,请看yii\log\Logger
的log方法,所以下面的代码还没到超时时间,内存就被$this->messages
数组撑爆了,只要循环没结束$this->messages数组的长度就会无限增加!注意在关闭debug的情况不会出现,因为关闭debug 不会往$this->messages
里存数据
public function actionTest()
{
$time = time();
$timeout = 20;
while(1)
{
if(Yii::$app->redis->exists("test_taskid"))
{
echo "exists";
break;
}else
{
if(time()-$time > $timeout)
{
echo "chaoshi";
break;
}
}
}
}
1058955466
注册时间:2017-11-24
最后登录:2020-03-28
在线时长:9小时29分
最后登录:2020-03-28
在线时长:9小时29分
- 粉丝2
- 金钱40
- 威望0
- 积分130