Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Кэширование данных в файл
Покинул форум
Сообщений всего: 231
Дата рег-ции: Окт. 2011
Помог: 5 раз(а)
[+]
Доброго времени суток.
Я пишу свою собственную разработку и подошел к моменту когда мне необходимо реализовать кэширование данных в файл, т.к. существуют операции результат которых изменяется не часто и нет необходимости при каждом запуске скрипта проводить обработку данных.
Меня не интересует реализация, у меня вопрос чисто по концепции кэширования.
В различных CMS, скриптах и т.п. кэширование реализуется путем сериализации данных и записи их в файл, при этом файл обычно имеет "необычное" название (обычно хэш ключа, т.е. его название не указывает на его содержание).
Для чтения кэша читается весь файл и десереализуется, после этого возвращается значение.
Я немного не понял: 1. Для чего кэш файлу с сериализованными данными давать такое название? Ведь это занимает время для работы с классом, необходимо высчитать хэш строки.
2. Зачем вообще сериализовывать данные? Почему нельзя создать .php файл с именем ключа, переменной внутри которая будет хранить нужные данные, а для чтения просто подключать файл (require) и получать эту переменную? Все будет работать быстрее, т.к. не надо будет высчитывать хэш ключа, не надо будет тратить время на fopen/fread/filesize, не надо будет десереализовывать данные (особенно заметно, если там хранятся масштабные данные, вроде кэша языковых фраз, количество которых измеряется сотнями).
Заранее благодарю за помощь.
chubrick
Отправлено: 16 Октября, 2012 - 20:02:38
Новичок
Покинул форум
Сообщений всего: 8
Дата рег-ции: Окт. 2012
Помог: 0 раз(а)
кэши бывают разные. В основном кэшируется полный вывод страницы. При добавлении и изменении, кэш обновляется. Высчитывание хеша это не такая уж и долгая операция. И вообще, кэш это не для людей, а для программы, поэтому ему незачем иметь понятное имя. Можно, конечно, именовать файлы, как url_session_ip.php, но будут очень длинные имена и уязвимость, если имя (из-за урл) превысит максимум. Сериализуются, обычно, объекты (иногда с наследованием), а не простые переменные и массивы. Даже ассоциативный массив не так просто записать в файл с синтаксисом php.
DlTA
Отправлено: 16 Октября, 2012 - 20:18:14
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
chubrick пишет:
Даже ассоциативный массив не так просто записать в файл с синтаксисом php.
а серилизуют данные для того чтоб хранить кеш не только в файлах но например в базе (Добавление)
1 - чтоб не заморачиваться сильно с именем) дал для ячейки какое нить кирилическое название с пробелами и другими недопустимыми символами, и ходишь спокойно.
Мелкий
Отправлено: 16 Октября, 2012 - 20:27:55
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
chubrick пишет:
В основном кэшируется полный вывод страницы.
Что нередко как раз неверно, т.к. напрасно раздувает объём кэша.
chubrick пишет:
Даже ассоциативный массив не так просто записать в файл с синтаксисом php.
Да ну? var_export.
Вот объекты - да. Но объекты пихать в кэш вообще неважная идея.
_Dark_ пишет:
Все будет работать быстрее
Не факт, но надо тестировать. Желательно с json'ом, который значительно быстрее сериализации, но и сохранить может не всё.
_Dark_ пишет:
1. Для чего кэш файлу с сериализованными данными давать такое название?
В основном - гарантированная максимальная длина значения при ключе любого размера. А так же - любой ключ, в том числе из спецсимволов, из-за чего можно кэшировать целиком страницу.
----- PostgreSQL DBA
_Dark_
Отправлено: 16 Октября, 2012 - 20:38:59
Частый гость
Покинул форум
Сообщений всего: 231
Дата рег-ции: Окт. 2011
Насчет хэша в имени понятно, для того, чтобы файл имел корректное имя всегда.
Меня интересует простой кэш данных, я не хочу хранить там никаких страниц и т.д., просто есть операции результат которых изменяется только в определенный момент, я хочу этот результат сохранить и просто загружать его, вместо того, чтобы высчитывать его заново.
chubrick пишет:
И вообще, кэш это не для людей, а для программы, поэтому ему незачем иметь понятное имя.
Мне кажется, что для программы тоже проще просто взять переменную с данными, чем вначале десереализовывать их. Конечно я могу ошибаться.
(Добавление) Мелкий, и да, а чем плохо вывод кэшировать? вот есть у меня магазин. Там все для всех выглядит одинаково. Блок с корзиной подгружается ajax. Так почему бы мне не закэшировать все страницы в файлы? Чем это плохо?
Мелкий
Отправлено: 16 Октября, 2012 - 21:53:08
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
chubrick пишет:
чем плохо вывод кэшировать?
0) неудобно инвалидировать. И много чего перестраивать при инвалидации
1) информация бесполезно дублируется (прямое следствие нулевого пункта). В примере с магазином - спецпредложения какие-нибудь, каталог, фильтры по каталогу - все используют один и тот же элемент, но кэшируется многократно
Раз уж упомянул фильтры - самая частоиспользуемая опция и ведёт к огромному росту кэша страниц.
2) и, напоследок, какой вообще смысл грузить тяжеловесный php, когда есть nginx?
----- PostgreSQL DBA
_Dark_
Отправлено: 17 Октября, 2012 - 14:30:48
Частый гость
Покинул форум
Сообщений всего: 231
Дата рег-ции: Окт. 2011
Помог: 5 раз(а)
[+]
Господа, не уходите от темы
Можно ли сделать так, как я указал выше?
Мелкий пишет:
Желательно с json'ом, который значительно быстрее сериализации, но и сохранить может не всё.
Проверил.
Пара json_encode / json_decode медленнее serialize / unserialize в ~7 раз.
Проверял на примере ассоциативного массива из 700 элементов, содержание ключей и значений — строки.
Мелкий
Отправлено: 17 Октября, 2012 - 14:40:53
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
_Dark_ пишет:
Проверил.
Пара json_encode / json_decode медленнее serialize / unserialize в ~7 раз.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.