@AlikDex

Кеширование объектов в Yii2. Пример, который приводит к ошибке. Почему?

Столкнулся с проблемкой. Есть функция такая, получает ид диалога с пользователем по его id(пользователя):
public static function getDialogByUserId(int $user_id)
	{
		$keyCache = 'dlg:byuserid:' . $user_id;
		$unionQuery = Yii::$app->redis->get($keyCache);
		
		if (false === $unionQuery) {
			$query1 = self::find()
						->where(['user_one' => $user_id, 'user_two' => Yii::$app->user->id]);
	
			$query2 = self::find()
						->where(['user_two' => $user_id, 'user_one' => Yii::$app->user->id]);
	
			$unionQuery = self::find()
				->from(['x' => $query1->union($query2)])
				->one();
echo '<pre>';
var_dump($unionQuery);
echo '</pre>';
			//Yii::$app->redis->set($keyCache, $unionQuery, 600);
		}

		return $unionQuery;
	}


редис не родной yii, а пекля пхпшная используется как кеш.

В таком виде работает нормально, т.е. диалог ищется, объект AR отдается. Но если пробую этот объект засунуть в редис, то вылетает ошибка о нехватке памяти. Почему?

Дамп AR объекта:
object(common\models\dialogs\Conversation)#157 (8) {
  ["_attributes":"yii\db\BaseActiveRecord":private]=>
  array(7) {
    ["c_id"]=>
    int(48)
    ["user_one"]=>
    int(8)
    ["user_two"]=>
    int(3)
    ["last_message"]=>
    string(37) "Ну да, типа работает "
    ["ip"]=>
    string(15) "255.255.255.255"
    ["created_at"]=>
    string(19) "2016-07-23 04:05:51"
    ["updated_at"]=>
    string(19) "2016-07-23 04:30:23"
  }
  ["_oldAttributes":"yii\db\BaseActiveRecord":private]=>
  array(7) {
    ["c_id"]=>
    int(48)
    ["user_one"]=>
    int(8)
    ["user_two"]=>
    int(3)
    ["last_message"]=>
    string(37) "Ну да, типа работает "
    ["ip"]=>
    string(15) "255.255.255.255"
    ["created_at"]=>
    string(19) "2016-07-23 04:05:51"
    ["updated_at"]=>
    string(19) "2016-07-23 04:30:23"
  }
  ["_related":"yii\db\BaseActiveRecord":private]=>
  array(0) {
  }
  ["_errors":"yii\base\Model":private]=>
  NULL
  ["_validators":"yii\base\Model":private]=>
  NULL
  ["_scenario":"yii\base\Model":private]=>
  string(7) "default"
  ["_events":"yii\base\Component":private]=>
  array(2) {
    ["beforeInsert"]=>
    array(1) {
      [0]=>
      array(2) {
        [0]=>
        array(2) {
          [0]=>
          object(yii\behaviors\TimestampBehavior)#159 (6) {
            ["createdAtAttribute"]=>
            string(10) "created_at"
            ["updatedAtAttribute"]=>
            string(10) "updated_at"
            ["value"]=>
            object(Closure)#158 (2) {
              ["this"]=>
              *RECURSION*
              ["parameter"]=>
              array(1) {
                ["$event"]=>
                string(10) ""
              }
            }
            ["attributes"]=>
            array(2) {
              ["beforeInsert"]=>
              array(2) {
                [0]=>
                string(10) "created_at"
                [1]=>
                string(10) "updated_at"
              }
              ["beforeUpdate"]=>
              array(1) {
                [0]=>
                string(10) "updated_at"
              }
            }
            ["skipUpdateOnClean"]=>
            bool(true)
            ["owner"]=>
            *RECURSION*
          }
          [1]=>
          string(18) "evaluateAttributes"
        }
        [1]=>
        NULL
      }
    }
    ["beforeUpdate"]=>
    array(1) {
      [0]=>
      array(2) {
        [0]=>
        array(2) {
          [0]=>
          object(yii\behaviors\TimestampBehavior)#159 (6) {
            ["createdAtAttribute"]=>
            string(10) "created_at"
            ["updatedAtAttribute"]=>
            string(10) "updated_at"
            ["value"]=>
            object(Closure)#158 (2) {
              ["this"]=>
              *RECURSION*
              ["parameter"]=>
              array(1) {
                ["$event"]=>
                string(10) ""
              }
            }
            ["attributes"]=>
            array(2) {
              ["beforeInsert"]=>
              array(2) {
                [0]=>
                string(10) "created_at"
                [1]=>
                string(10) "updated_at"
              }
              ["beforeUpdate"]=>
              array(1) {
                [0]=>
                string(10) "updated_at"
              }
            }
            ["skipUpdateOnClean"]=>
            bool(true)
            ["owner"]=>
            *RECURSION*
          }
          [1]=>
          string(18) "evaluateAttributes"
        }
        [1]=>
        NULL
      }
    }
  }
  ["_behaviors":"yii\base\Component":private]=>
  array(1) {
    ["timestamp"]=>
    object(yii\behaviors\TimestampBehavior)#159 (6) {
      ["createdAtAttribute"]=>
      string(10) "created_at"
      ["updatedAtAttribute"]=>
      string(10) "updated_at"
      ["value"]=>
      object(Closure)#158 (2) {
        ["this"]=>
        *RECURSION*
        ["parameter"]=>
        array(1) {
          ["$event"]=>
          string(10) ""
        }
      }
      ["attributes"]=>
      array(2) {
        ["beforeInsert"]=>
        array(2) {
          [0]=>
          string(10) "created_at"
          [1]=>
          string(10) "updated_at"
        }
        ["beforeUpdate"]=>
        array(1) {
          [0]=>
          string(10) "updated_at"
        }
      }
      ["skipUpdateOnClean"]=>
      bool(true)
      ["owner"]=>
      *RECURSION*
    }
  }
}


Ну и сама ошибка:

Allowed memory size of 134217728 bytes exhausted (tried to allocate 2118167486 bytes)
  • Вопрос задан
  • 1211 просмотров
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
1. Вы получаете объект. Все отлично и памяти хватает, пока это стандартный объект, но засовывая его куда либо - он преобразуется в строку видимо. Поэтому может и не хватать памяти.
2. Для кеширования запросов, в yii2 есть отдельный механизм: www.yiiframework.com/doc-2.0/guide-caching-data.ht...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
vyachin
@vyachin
Ищу работу
вы уж простите, но у вас проблема с понимание смысла кеширования. Сейчас вы извлекаете данные из базы (много данных) и кладете в кеш. Зачем???? Вы не эффективно используете кеш. В кеш нужно положить не сырые данные, а уже обработанные. Чем больше этапов вы объедините - тем эффективнее кеширование.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы