1058955466 2017-12-26 17:47:38 834次浏览 1条回复 0 0 0

请看以下代码,貌似没什么毛病,其实这段代码并不会超时退出循环而是会抛出内存溢出问题,为什么呢? 查看源代码发现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;
            }
        }
    }
}
您需要登录后才可以回复。登录 | 立即注册