Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
4
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
892
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4380
0
Помогите пожалуйста решить задачи
24th November, 23:53
6084
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4308
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2598
0
Статьи про кэширование в PHP
Просмотров: 351
 
Ответов: 6
Кэширование в PHP для меня до сих пор остаётся тёмной областью. Во многом это связано с том, что все статьи деляться на две категории:
1) Сейчас мы расскажем вам про буферизацию вывода...(до чего я и сам додумался :) )
2) Работа с memcache и нагруженные проекты(что превышает мои потребности на данный момент)
Между тем, посмотришь на коды различных CMS: там всё намного разнообразнее. Кроме кэширования целой страницы могут кэшироваться отдельные модули, результаты запросов, вот это всё меня и интересует больше всего. Но по коду осознать реализацию у меня не очень получается.
Теоретические то статьи я видел, практики бы, как это лучше писать, чтобы потом не пришлось переписывать, периодечески матерясь :)
Кэширование — это очень сложно. Если у вас вносятся изменения в БД, то появляется масса проблем с инвалидацией. Инвалидацию очень легко забыть где-нибудь вставить, даже если с этим помогает фреймворк/ORM.
Все «полностью автоматизированные» решения по кэшированию, создавали гигантские проблемы, потому что в каких-то случаях не инвалидировали кэш, когда нужно. Допустим, есть объект Profile со свойством balance. Пользователь покупает услуги, генерируется invoice, и либо баланс показывается закэшированный, либо инвойс не появляется в списке закэшированных инвойсов. Оба случая вызывают неистовое негодование пользователей, поверьте моему опыту.
Вручную тоже сложно все предусмотреть. В сложной системе оказывается на удивление много мест, где кэш необходимо инвалидировать, и предусмотреть их все очень сложно (не превратив при этом код в спагетти).
К тому же, возникает вопрос эффективности. Инвалидировать слишком часто — теряется эффективность, приходится слишком часто обновлять данные из базы. Инвалидировать слишком редко — пользователи жалуются на устаревшие данные.
С тяжелыми запросами тоже все сложно. Допустим, есть очень тяжелый запрос, который необязательно инвалидировать, следовательно можно легко и просто закэшировать. Но первому пользователю все равно придется ждать, пока он завершится. А если результат выполнения разный для разных пользователей, то каждому придется подождать как минимум один раз. Никому это тоже не понравится.
В общем, готовых шаблонов на все случаи жизни нет. Только для read-only данных, и то с ограничениями. Задумываться о кэшировании желательно с самого начала реализации проекта, потом будет сложнее.
ну там несколько вообщем то своств у этого кэширования
куда скэшировать
-В файлики
-В память
-В базу данных (бывает и такое)
-Куда то еще (есть такие выдумки огоогоо)
Что скэшировать
— Результаты выполнения запросов (Что то в моделях)
— Готовый html (Прям вместе с запросами с явскриптом и со всем всем всем)
— Вообще кэшировать можно все что угодно любой объект который поддается сериализации
Остается только разобратся в каких случаях какую комбинацию стоит применять.
Механизм кэширования достаточно простой. Неважно какой у нас dataSource у нас есть интерфейс к любому мы его и используем (Так реализованно в Zend_Cache)
есть ключ есть значение, теги и время жизни кэша
К каждой паре ключ — значение мы можем присвоить тег и определенное время жизни
Теги нужны например чтобы по ним чистить кэш. (Опять же так реазизованно в Zend_Cache)
алгоритм простой:
Смотрим по ключу есть ли такое значение в кэше если есть получаем его, если нет получаем откуда то еще и засовываем в кэш.
Ключ можно составлять по разным принципам начиная от id какого ли бо объекта или id + еще id + еще id
или вообще можно использовать хэш от sql запроса.
Прочитайте про memcache, если вам нужно что то более мелкоколиберное попробуйте APC, ну и вообще все можно в файликах хранить на всякий случай. С файликами аккуратнее у меня однажды была история когда кэш занял все дисковое пространство, в результате моей ошибки.
Вообщем такие вот дела, ничего сложного, удачи!
Методы кеширования очень сильно зависят от ситуации. Если в одном случае положить результат запроса в memcache — добро, то в другом — это будет явное зло. А вот случаев может быть великое множество… Тут только практика.
По идее тут может помочь что-то вроде «обертки» вокруг методов кеширования. Поставил в настройках memcache, поглядел как работает. Потом поменял на memcachedb, например, и снова посмотрел… Ну а по результатам уже конкретный метод кеширования для конкретного случая выбирать.
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться