Основной способ борьбы с высокой нагрузкой ложится на кэширование. Именно за счет кэширования достигается максимальная разгрузка сервера. Для проектов с небольшой посещаемостью кэширование может вовсе не понадобится. А вот для более-менее посещаемых, использование кэша вполне оправданно. По моим прикидкам кэширование есть смысл использовать для сайтов от 100-200 хостов в день. Во всяком случае при такой посещаемости кэш обновляется не чаще, чем это будет требоваться.
В своей системе я максимально использую кеширование. Но трудность кэширования в том, что нельзя кэшировать всю страницу, поскольку какие-то блоки всегда должны быть уникальны. Например вывод случайных цитат. Поэтому в большинстве случаев я использую «локальное» кеширование.
То есть какая-та ресурсоемкая функция в самом начале кэширует себя. Например вывод рубрик нет смысла получать каждый раз из базы данных, потом строить его структуру и форматировать. Вместо этого мы один раз заносим результат в кэш и при последующих, просто отдаем его на вывод. Сама же функция по сути вообще не отрабатывается (только получение кэша).
Однако для больших проектов желательно использовать «глобальное» кэширование. Это такое кэширование, при котором в кэш «загоняются» готовые страницы. В этом случае мы вообще достигаем нулевой нагрузки на БД, поскольку «обходим» все функции шаблона.
Данный вид кэширования реализуется точно также, как и локальное. Разница только в том, что в качестве ключа нужно использовать адрес страницы (url). Вот пример шаблонного index.php:
$cache_key = mso_md5($_SERVER['REQUEST_URI']); $k = mso_get_cache($cache_key); if ($k) { $CI = & get_instance(); $k = str_replace('<!-- cache_info -->', ' | This cache: ' . $CI->db->query_count, $k); return print($k); } ob_start(); ... // время кэша в секундах mso_add_cache($cache_key, ob_get_flush(), 300);
Данный код выполняет кэширование любой страницы на 5 минут (300 секунд). В качестве примера я добавил замену cache_info на количество реальных запросов к БД.
Результаты на тестовом сайте такие:
- количество запросов сократилось с 12 до 0;
- потребление памяти сократилось с 3Мб до 2Мб;
- время работы сократилось с 1,5 секунд до 0,1-0,2 секунд.
Комментариев: 3 RSS
1Егор22-05-2008 07:31
Жду не дождусь Вашей CMS. С виду очень шустрая.
2Руслан25-08-2013 10:51
Максим, а нет ли BB-кода или тэга, чтобы обрамлять объекты, которые не следует включать в кэш?
3Максим25-08-2013 13:11
Нет, конечно.