Язык
Контакты
GitHub
Поддержка
Регистрация
Войти
Логин: Пароль: Запомнить:
Пользователи
Голосование

    Какую CMS Вы предпочитаете

    AtomX
    Fapos CMS
    Drunya CMS
Последние комментарии
Автор: чайник, в новости:

Что такое API и для чего они нужны

Автор: HIshnik, в новости:

Классы в PHP для чайников

Автор: Аноним, в новости:

Написание простого вируса в блокноте

Автор: stream, в новости:

Создаем BB коды на PHP

Автор: boriska, в новости:

Релиз Atom-M CMS 4

Автор: 0leg, в новости:

Релиз Atom-M CMS 4

Топ пользователей
Drunya
Репутация: 108
Сообщений: 3531
Сашка_из_Шебекино
Репутация: 87
Сообщений: 1803
boriska
Репутация: 65
Сообщений: 846
ARMI
Репутация: 46
Сообщений: 1859
BAH0
Репутация: 26
Сообщений: 544
И так, теперь мы знаем как реализовать на сайте простое кэширование, используя PHP. Но это подойдет разве что для гостевой или чего нибудь еще в таком духе. А если у нас в распоряжении сайт со множеством групп пользователей и каждый видит уникальную страницу? Конечно можно просто делать приставку к имени файла в виде названия группы. В таком случае все будет пучком, но если кэш одной страницы весит 5 кб, то теперь, если у нас скажем 10 групп пользователей, кэш этой же страницы будет весить уже 50 кб. И для нормального сайта с 5000 страниц размер кэша может составить 250 000 кб или 250 Мб. Казалось бы не так много, но в реальных условиях все куда хуже и плохо реализованный кэш может завалить вас гигабайтами ненужной информации.

Выход из этого положения - блочное кэширование. Блочное кэширование - это когда мы кэшируем не всю страницу сразу, а отдельные ее элементы. Это также помогает решить нам такие проблемы как разные сроки хранения у разных блоков и предотвращение кэширования некоторых частей сайта. Например если у вас на сайте есть блок, выводящий время, то закэшировав его, время на часах не будет меняться. Не правда ли это как то лажово? :)

И так немного примеров:
 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']?>
это файл к которому идет обращение и все что после "?", то есть GET. Ну а дальше я просто соединил это, собрав все в кучу. В реальной жизни конечно соединять прийдется другим способом, в зависимости от того как устроены ваши шаблоны, но с этим уже никаких проблем возникнуть не должно. Например можно поставить блок на свое законное место при помощи замены какой то метки.
 1 
 2 
<?php $content str_replace('{ADMIN_BAR}'$adm_bar$content);?>
Ну или что-то в таком духе.



С этим все понятно, но как чистить кэш по времени или при создании/добавлении материала? Вот об этом я и расскажу дальше. Сразу предупреждаю, тут я покажу самые простые примеры, а за более сложными схемами обращаться на форум. На форуме я с радостью перетру любые темы. И так я предлагаю записывать время создания файла кэша первой строкой в тот самый файл и при чтении просто проверять это время, а при выдачи кэша из файла, обрезать эту строку со временем.
 1 
 2 
<?php file_put_contents('cache.dat', (time() + 86400) . "\n" $content);?>
Таким образом мы записали первой строкой в файл тукущую метку времени + 86400 секунд(одни сутки). Это подразумевает что кэш мы будем хранить ровно сутки. Для этого при его получении делаем следующее:
 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($cachestrlen($match[1]));
     }

//тут например можно проверить пустой ли контент и если да, то начать его формировать и сохранять в кэш
//Если с кэшем у нас все было ОК и мы получили контент из кэша то на этом этапе он не будет пустым и следовательно
//это действие пропустится
if (empty($content)) {
     
//формируем
}?>



Ну я еще хотел рассказать как можно удалять кэш при создании материала, но понял что здесь и рассказывать нечего. Например после добавления записи в базу можно удалять все файлы из папки кэша. Вот и все. Но это очень не разумно на больших сайтах, так как материалы могут добавляться каждую минуту и тогда смысл от всего кэширования теряется и даже наоборот - сайт только тормозит. Выход в этой ситуации - удаление кэша по ключам. То есть если добавилась новоть, удаляем только кэш новостей, а если добавилась статья, удаляем кэш статей. Но как это реализовать я расскажу в следующей части этого цикла статей. А пока вы можете попрактиковатсья с тем о чем говорилось тут, я лишь дам подсказку: В файле кэша можно хранить не только метку времени;)

С вами был Drunya. И с наступающим вас:)
Кэширование в PHP и как его сделать. ЧАСТЬ 2

Теги: Блочное и временное кэширование. Увеличение скорости отдачи страниц на сайте;
Источник: Drunya
Автор: Drunya
Категория: PHP
Просмотров: 2766
Комментариев: 1

Комментарии
  • User avatar

    phpbot.ru

    Админ, не поленись увеличь шрифт на сайте - очень трудно читать! сильно глаза устают присматриваться!!!!
    Дата отправления: 6 Авг 2013
Сейчас online: 14. Зарегистрированных: 2. Гостей: 12.
-->