Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 24.04.2017 02:37:52

Кеширование объектов модели - как познать дзен?

Начал прикручивать кеширование к разрабатываемому проекту и увидел интересную особенность сериализации данных в PHP (на сколько я понял) - он серилиазует весь объект целиком (что логично), но мне не хочется, чтобы кеш "разбухал" за счет лишних данных.

Это как-то решаемо (писать свой сериализатор не очень хочется)?

Просто дело вот в чем: я сериализую 5 объектов, полученных из БД, причем чтобы уменьшить количество данных - беру только те, что нужны (использую

->select('column1', 'column2')

). И получается такая ситуация, что для того, чтобы закешировать 280 байт данных (специально посчитал, но это только values, без key и т.д), я кеширую строку в 7950 байт, где большую часть данных занимают:
1. Массив fillable - в каждом объекте
2. Массив attributes (он нужен, я знаю), который дублируется точно такими же данными в массиве original -  в каждом объекте
3. Кучей пустых свойств/массивов (casts, dateFormat, appends, events, observables, relations, touches, hidden, visible, guarded и т.д) -  в каждом объекте

Мне не жалко места, но хочется разобраться и возможно обнаружить какие-то "best practice" по кешированию в laravel (мб вы сейчас сразу скажите, что мне не нужно кешировать объекты модели).

Не в сети

#2 24.04.2017 03:09:43

Re: Кеширование объектов модели - как познать дзен?

Сейчас подумалось: быть может имеет смысл мне кешировать результат выполнения, а не объекты?

Мне нужно кешировать:
1. view composers - не понимаю как
2. controllers - на сколько понял по гуглу - проще всего через view()->render() (с различным отображением для различных сессий возможно в этом нет смысла, как и с тем, что в кеше могут оказаться разные пагинаторы).

Не в сети

#3 24.04.2017 07:49:56

Re: Кеширование объектов модели - как познать дзен?

Если нужны только данные, а не сам объект, можно использовать ->toArray() (или toJson) на объекте:

$data = Model::get()->toArray();

Не в сети

#4 24.04.2017 11:52:44

Re: Кеширование объектов модели - как познать дзен?

AlexeyMezenin пишет:

Если нужны только данные, а не сам объект, можно использовать ->toArray() (или toJson) на объекте:

$data = Model::get()->toArray();

Нужны только данные, чтобы вывести объект в шаблоне.

Но надо будет поменять вид обращений в массиве к этому объекту (сменить $obj->prop на $obj['prop']) - верно?

И такой способ является хорошим тоном или это уже слишком?

Не в сети

#5 24.04.2017 12:13:24

Re: Кеширование объектов модели - как познать дзен?

Если размер кэша важен, тогда создавай массив и обращайся через []. Если не очень, я бы сохранил коллекцию, потому что работать с коллекциями намного удобнее. Как вариант, создать свой метод, который бы трансформировал Eloquent коллекцию в коллекцию без ненужных данных, но это может быть достаточно сложной задачей, если широко используются отношения и пр.

На счет дурного тона, я бы не беспокоился. Почти все частично или полностью написанные проекты, которые я вижу - это полный атас и использование массивов вместо коллекций после этого не выглядит чем-то ужасным. Опять же, имей ввиду, что работать с коллекциями гораздо проще (=дешевле/быстрее).

Изменено AlexeyMezenin (24.04.2017 12:16:16)

Не в сети

#6 25.04.2017 22:54:12

Re: Кеширование объектов модели - как познать дзен?

Lord_Alfred пишет:

Сейчас подумалось: быть может имеет смысл мне кешировать результат выполнения, а не объекты?

На данный вопрос ответ знаешь только ты, ибо все от случая к случаю. и как правило все достаточно очевидно, как лучше в конкретном случае.

Что за кэш? много где используется igbinary, примитивное сравнение - https://codepoets.co.uk/2011/php-serial … -igbinary/

Не в сети

Подвал раздела