Голосование
Какую CMS Вы предпочитаете
AtomX
Fapos CMS
Drunya CMS
Топ новостей
- Генератор аватарок в стиле пиксель-арт
- Скачать Fapos CMS 1.1.8 Бесплатно
- Цунами в Японии. Последствия.
- Предварительная инфа о FAPOS 1.1.9. Часть 2
- Описание версии CMS Fapos 0.9.9
- Новая версия Fapos 1.3
- Половина россиян не смогла отличить легальный контент
- Что есть Fapos CMS
- Убийца Apache у вас на пороге
- Открытое тестирование Fapos 0.9.9
Последние комментарии
Топ пользователей
Сайты на AtomX CMS
И так, теперь мы знаем как реализовать на сайте простое кэширование, используя PHP. Но это подойдет разве что для гостевой или чего нибудь еще в таком духе. А если у нас в распоряжении сайт со множеством групп пользователей и каждый видит уникальную страницу? Конечно можно просто делать приставку к имени файла в виде названия группы. В таком случае все будет пучком, но если кэш одной страницы весит 5 кб, то теперь, если у нас скажем 10 групп пользователей, кэш этой же страницы будет весить уже 50 кб. И для нормального сайта с 5000 страниц размер кэша может составить 250 000 кб или 250 Мб. Казалось бы не так много, но в реальных условиях все куда хуже и плохо реализованный кэш может завалить вас гигабайтами ненужной информации.
Выход из этого положения - блочное кэширование. Блочное кэширование - это когда мы кэшируем не всю страницу сразу, а отдельные ее элементы. Это также помогает решить нам такие проблемы как разные сроки хранения у разных блоков и предотвращение кэширования некоторых частей сайта. Например если у вас на сайте есть блок, выводящий время, то закэшировав его, время на часах не будет меняться. Не правда ли это как то лажово?
И так немного примеров:
И так немного расскажу что же я проделал. Сперва я сформировал приставку для файлов кэша админской панели, проверив есть ли в сессии идентификатор группы и если он есть, то взял в качестве приставки именно этот идентификатор, а если нет, то оставил эту приставку пустой. Можно сделать и более элегантное решение, но это же пример епта. Далее я сформировал админбар. Это вы помните из прошлой статьи, я проверил кэш и если его нет я его создал, а если есть, то взял все из него.
Далее я таким же макаром собрал контент часть. Только вместо приставки я уже юзал не группу юзера, а строку запроса.
это файл к которому идет обращение и все что после "?", то есть GET. Ну а дальше я просто соединил это, собрав все в кучу. В реальной жизни конечно соединять прийдется другим способом, в зависимости от того как устроены ваши шаблоны, но с этим уже никаких проблем возникнуть не должно. Например можно поставить блок на свое законное место при помощи замены какой то метки.
Ну или что-то в таком духе.
С этим все понятно, но как чистить кэш по времени или при создании/добавлении материала? Вот об этом я и расскажу дальше. Сразу предупреждаю, тут я покажу самые простые примеры, а за более сложными схемами обращаться на форум. На форуме я с радостью перетру любые темы. И так я предлагаю записывать время создания файла кэша первой строкой в тот самый файл и при чтении просто проверять это время, а при выдачи кэша из файла, обрезать эту строку со временем.
Таким образом мы записали первой строкой в файл тукущую метку времени + 86400 секунд(одни сутки). Это подразумевает что кэш мы будем хранить ровно сутки. Для этого при его получении делаем следующее:
Ну я еще хотел рассказать как можно удалять кэш при создании материала, но понял что здесь и рассказывать нечего. Например после добавления записи в базу можно удалять все файлы из папки кэша. Вот и все. Но это очень не разумно на больших сайтах, так как материалы могут добавляться каждую минуту и тогда смысл от всего кэширования теряется и даже наоборот - сайт только тормозит. Выход в этой ситуации - удаление кэша по ключам. То есть если добавилась новоть, удаляем только кэш новостей, а если добавилась статья, удаляем кэш статей. Но как это реализовать я расскажу в следующей части этого цикла статей. А пока вы можете попрактиковатсья с тем о чем говорилось тут, я лишь дам подсказку: В файле кэша можно хранить не только метку времени
С вами был Drunya. И с наступающим вас
Выход из этого положения - блочное кэширование. Блочное кэширование - это когда мы кэшируем не всю страницу сразу, а отдельные ее элементы. Это также помогает решить нам такие проблемы как разные сроки хранения у разных блоков и предотвращение кэширования некоторых частей сайта. Например если у вас на сайте есть блок, выводящий время, то закэшировав его, время на часах не будет меняться. Не правда ли это как то лажово?
И так немного примеров:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php //узнаем группу юзера если она есть. Далее это будет приставка к нашим кэшам с админбаром
$user_group = (!empty($_SESSION['user']['group'])) ? $_SESSION[''user]['group'] : '';
$adm_bar_cache = $user_group . '_adm_bar.dat';
if (file_exists($adm_bar_cache)) {
$adm_bar = file_get_contents($adm_bar_cache);
} else {
ob_start();
//формируем админбар
$adm_bar = ob_get_clean();
file_put_contents($adm_bar_cache,$adm_bar);
}
//теперь формируем основную часть
$pref = md5($_SERVER['REQUEST_URI'] . $_SERVER['QUERY_STRING']);
$content_cache = $pref . '.dat';
if (file_exists($content_cache)) {
$adm_bar = file_get_contents($content_cache);
} else {
ob_start();
//формируем контент
$content = ob_get_clean();
file_put_contents($content_cache, $content);
}
//теперь у нас есть контент и админ бар. Надо их соединить и сформировать некэширующиеся блоки
$not_cached = date("Y-m-d"); //это то что не кэшируется
$uotput = $adm_bar . $content . $not_cached;?>
И так немного расскажу что же я проделал. Сперва я сформировал приставку для файлов кэша админской панели, проверив есть ли в сессии идентификатор группы и если он есть, то взял в качестве приставки именно этот идентификатор, а если нет, то оставил эту приставку пустой. Можно сделать и более элегантное решение, но это же пример епта. Далее я сформировал админбар. Это вы помните из прошлой статьи, я проверил кэш и если его нет я его создал, а если есть, то взял все из него.
Далее я таким же макаром собрал контент часть. Только вместо приставки я уже юзал не группу юзера, а строку запроса.
1
2
<?php $_SERVER['REQUEST_URI'] . $_SERVER['QUERY_STRING']?>
1
2
<?php $content = str_replace('{ADMIN_BAR}', $adm_bar, $content);?>
С этим все понятно, но как чистить кэш по времени или при создании/добавлении материала? Вот об этом я и расскажу дальше. Сразу предупреждаю, тут я покажу самые простые примеры, а за более сложными схемами обращаться на форум. На форуме я с радостью перетру любые темы. И так я предлагаю записывать время создания файла кэша первой строкой в тот самый файл и при чтении просто проверять это время, а при выдачи кэша из файла, обрезать эту строку со временем.
1
2
<?php file_put_contents('cache.dat', (time() + 86400) . "\n" . $content);?>
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php if (file_exists($cache_file)) {
$cache = file_get_contents($cache_file);
if (preg_match('#^(\d+)#', $cache, $match)) {
//если метка времени в файле больше текущей то мы вырезаем ее и делаем содержимое файла контентом
if ($match[1] > time()) $content = substr($cache, strlen($match[1]));
}
}
//тут например можно проверить пустой ли контент и если да, то начать его формировать и сохранять в кэш
//Если с кэшем у нас все было ОК и мы получили контент из кэша то на этом этапе он не будет пустым и следовательно
//это действие пропустится
if (empty($content)) {
//формируем
}?>
Ну я еще хотел рассказать как можно удалять кэш при создании материала, но понял что здесь и рассказывать нечего. Например после добавления записи в базу можно удалять все файлы из папки кэша. Вот и все. Но это очень не разумно на больших сайтах, так как материалы могут добавляться каждую минуту и тогда смысл от всего кэширования теряется и даже наоборот - сайт только тормозит. Выход в этой ситуации - удаление кэша по ключам. То есть если добавилась новоть, удаляем только кэш новостей, а если добавилась статья, удаляем кэш статей. Но как это реализовать я расскажу в следующей части этого цикла статей. А пока вы можете попрактиковатсья с тем о чем говорилось тут, я лишь дам подсказку: В файле кэша можно хранить не только метку времени
С вами был Drunya. И с наступающим вас
Кэширование в PHP и как его сделать. ЧАСТЬ 2
Теги: Блочное и временное кэширование. Увеличение скорости отдачи страниц на сайте;
Источник: Drunya
Теги: Блочное и временное кэширование. Увеличение скорости отдачи страниц на сайте;
Источник: Drunya
Комментарии
-
phpbot.ru
Админ, не поленись увеличь шрифт на сайте - очень трудно читать! сильно глаза устают присматриваться!!!!Дата отправления: 6 Авг 2013
Сейчас online: 95. Зарегистрированных: 0. Гостей: 95.
AtomX 2.8 Beta - Новая версия бесплатной CMS
AtomX 2.8 Beta - Новая версия бесплатной CMS
Программирование - что может быть проще.
Программирование - что может быть проще.
AtomX 2.8 Beta - Новая версия бесплатной CMS
AtomX 2.8 Beta - Новая версия бесплатной CMS
Написание простого вируса в блокноте
Что такое API и для чего они нужны
Классы в PHP для чайников
Написание простого вируса в блокноте