Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Начал прикручивать кеширование к разрабатываемому проекту и увидел интересную особенность сериализации данных в 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 (мб вы сейчас сразу скажите, что мне не нужно кешировать объекты модели).
Не в сети
Сейчас подумалось: быть может имеет смысл мне кешировать результат выполнения, а не объекты?
Мне нужно кешировать:
1. view composers - не понимаю как
2. controllers - на сколько понял по гуглу - проще всего через view()->render() (с различным отображением для различных сессий возможно в этом нет смысла, как и с тем, что в кеше могут оказаться разные пагинаторы).
Не в сети
Если нужны только данные, а не сам объект, можно использовать ->toArray() (или toJson) на объекте:
$data = Model::get()->toArray();
Не в сети
Если нужны только данные, а не сам объект, можно использовать ->toArray() (или toJson) на объекте:
$data = Model::get()->toArray();
Нужны только данные, чтобы вывести объект в шаблоне.
Но надо будет поменять вид обращений в массиве к этому объекту (сменить $obj->prop на $obj['prop']) - верно?
И такой способ является хорошим тоном или это уже слишком?
Не в сети
Если размер кэша важен, тогда создавай массив и обращайся через []. Если не очень, я бы сохранил коллекцию, потому что работать с коллекциями намного удобнее. Как вариант, создать свой метод, который бы трансформировал Eloquent коллекцию в коллекцию без ненужных данных, но это может быть достаточно сложной задачей, если широко используются отношения и пр.
На счет дурного тона, я бы не беспокоился. Почти все частично или полностью написанные проекты, которые я вижу - это полный атас и использование массивов вместо коллекций после этого не выглядит чем-то ужасным. Опять же, имей ввиду, что работать с коллекциями гораздо проще (=дешевле/быстрее).
Изменено AlexeyMezenin (24.04.2017 12:16:16)
Не в сети
Сейчас подумалось: быть может имеет смысл мне кешировать результат выполнения, а не объекты?
На данный вопрос ответ знаешь только ты, ибо все от случая к случаю. и как правило все достаточно очевидно, как лучше в конкретном случае.
Что за кэш? много где используется igbinary, примитивное сравнение - https://codepoets.co.uk/2011/php-serial … -igbinary/
Не в сети
Страницы 1