кеширование некоторых частей сайта

Spear

почемучка
кеширование некоторых частей сайта

Здравствуйте,
у меня такой впоросик появился:
на сайте есть некоторые части, которые не так уж часто обновляются (например раз в час или раз в пару часов), но получается что каждый раз при обновлении страницы это дело заново генирируется.

Очень хочу сделать кеширование этих частей на стороне сервера (если я правильно понимаю это назвается кеширование вывода)

Может быть подскажете хорошую статью по теме, или может быть для этой цели есть хороший класс?
 

Tor

Новичок
почему бы при обновлении не генерировать чистый хтмл?
 

kvf77

Red Devil
Spear

SQL запросы прекрасно умеет кэшировать ADODB
Выводи и шаблоны - Smarty

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

Spear

почемучка
этот вариант не подходит.
Тем более мне даже просто интересно разобраться с кешированием со стороны сервера.
Ещё такой вопросик - у меня для корректной работы некоторых блоков на сайте (что-то типо статистики) нужно вытаскивать из базы несколько переменных. Опять же - не очень важно если они будут обновляться раз в 30-60 минут.
Но тут мне нужно именно переменную как-то сохранить.
Есть ли смысл генирировать на стороне сервера РНР файл с содержимым примерно:

<?
$deadlyNeedeVars['var1'] = 123;
$deadlyNeedeVars['var2'] = test;
$deadlyNeedeVars['var3'] = 1223;
$deadlyNeedeVars['var4'] = 14323;
?>
?
 

kruglov

Новичок
Spear

Смысл есть.

При ответе пишите, кому отвечаете, а то про кого Вы написали "не подходит"?
 

Spear

почемучка
SQL запросы прекрасно умеет кэшировать ADODB
даже не заю что это :) :)()

Выводи и шаблоны - Smarty
не умею пользоваться смарти.. даже отдаленно не представляю как это будет выглядеть.
Сайт не на шаблонах, страница создается инклудами header.php (который генерируется в зависимости от натсроек скина) и т.п.

В целом же методология проста:
В своих скриптах пишешь все в буфер, в конце скрипта сохраняешь в файл с признаком времени создания
filemtime? я так и хотел сделать, но прочитал в статье (http://phpclub.ru/faq/wakka.php?wakka=TekushhiePopolnenija/PerevodHTTPCaching/CaptureServerSideOutputForCaching&v=110m)
такую фразу:

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

Буду благодарен за ответы ;)

-~{}~ 03.10.05 10:16:

kruglov
про неподходит - это Тору
 

kvf77

Red Devil
Spear
читай больше - да ниче такого не будет, если обратиться. как вариант, на который видать у автора не хватило думкалки, создавай второй файл, после того как он будет ПОЛНОСТЬЮ создан, заменяй им первый - делов-то и никаких особых проблем не будет.

к томуже твой скрипт может писать флаг генерации нового файла, если флаг есть - организуем в срипте паузу и проверяем опять - флаг исчез - выводим на экран.

Про ADODB читай тут на русском:
http://php.russofile.ru/ru/translate/sql/

очень рекомендую к использовнаию
 

Spear

почемучка
после того как он будет ПОЛНОСТЬЮ со
а как узнать - создан он полностью или нет? :)
прошу прощения если задаю глупый вопрос.
Была идея писать в начало нужной страницы (генирируемой) и в конце что-то типо
<!--Block1 start-->
html
<!--Block1 end-->
и потом проверять регеспом.

твой скрипт может писать флаг генерации нового файла, если флаг есть - организуем в срипте паузу и проверяем опять - флаг исчез - выводим на экран.
опять не понял - что имеется ввиду под словом "флаг"?
 

SiMM

Новичок
> так и не понял что имел ввиду автор..
Автор имел в виду, что его код - лишь иллюстрация, а с файлом надо работать более грамотно. Тогда таких проблем не будет.
 

kvf77

Red Devil
Spear

ты уверен, что тебе по силам то, за что ты берешься? а то ты упорно никого не понимаешь...
 

svetasmirnova

маленький монстрик
>больше того - ему кэширование это не нужно.
По поводу вывода согласна.
А вот по поводу SQL-запросов... Что вы человека ADODB-ами грузите? База какая? В MySQL достаточно в селектах указывать SQL_CACHE. (Spear, мануал почитай перед использованием) В других надо посмотреть.
 

Spear

почемучка
Посмотрите, пожалуйста, правильно я сделал?
у меня задача - снять лишнюю нагрузку на БД, ускорить загрузку страницы.

сначала функции:
PHP:
function useCached($filename, $timeout)
{
    if (file_exists('./cache/' . $filename) AND (time()-filemtime('./cache/' . $filename) < $timeout))
    {
			return TRUE;
    }
    else 
    {
        return FALSE;
    }
}
    
 function writeCache($content, $filename) {
    $fp = fopen('./cache/' . $filename, 'w');
    fwrite($fp, $content);
    fclose($fp);
  }
  
    function readCache($filename)
    {
        if (file_exists('./cache/' . $filename))
        {
            readfile ('./cache/' . $filename);
            
        }
        ELSE { return FALSE;}
    }
А вот как использую.
PHP:
if(!useCached('modules/index/bl1.chache','20'))
{
... запросы в бд, генерация хтмл....
writeCache($newch,'modules/index/bl1.chache'); 
}

дальше (немного ниже, уже при выводе ХТМЛа пользователю):

readCache('modules/index/bl1.chache');
Подскажите, пожалуйста - не замедлит ли это загрузку страницы?
Правильно ли написаны функции? что моно добавить, что бы избежать ошибок при генерации файла *.chache??

-~{}~ 03.10.05 11:36:

то есть что получается - мне ob_start и ob_get_contents не нужно было изначально для реализации задуманного.
Вопрос в том - правильно ли я сделал вышеописанное?
 

Фанат

oncle terrible
Команда форума
у меня задача - снять лишнюю нагрузку на БД
насколько она лишняя?
ускорить загрузку страницы
какова скорость сейчас?
какого прироста ты желаешь добиться?

Посмотрите, пожалуйста, правильно я сделал?
неправильно.
надо не кэшировать кривые скрипты, а оптимизировать их работу
 

Spear

почемучка
насколько она лишняя?
на странцу 30 запросов.
Я такой оптимизацией я ничего не еряю (на самом деле обновление этих кешируемых частей - не чаще 5-7 раз в стуки) уберу минимум половину запросов.


какова скорость сейчас?
какого прироста ты желаешь добиться?
0.1 сек в среднем (на локалке). Но тут для меня больее важно не замедлить загрузку. То есть чтобы неполучлиос
ь так, что я сократил нагрузку на БД но страницы стали грузиться медленнее.

надо не кэшировать кривые скрипты, а оптимизировать их работу
оптимизировал по максимуму. Конечно у меня не на всех страницах 30 запросов - такие "напряжные" в основном главные страницы модулей. На главной, например, идет вывод всех последних обновлений из почти каждого раздела на сайте + некоторая статистика.
 

Spear

почемучка
Фанат
ня имел ввиду "оптимизировал настолько, наскольк хватило моих скромных знаний в области РНР" :)

Ну а если серьезно - неужели так плох мой вариант? я почему-то думал что все крупные проекты стараются выдавать юзеру как можно больше статики. (то есть кеша со стороны сервера).

-~{}~ 03.10.05 11:59:

вот например http://www.gamespot.com
почему-то мне кажется что там все что видит пользователь - кеш на стороне сервера (имею ввиду главную страницу).
 

svetasmirnova

маленький монстрик
>Ну а если серьезно - неужели так плох мой вариант?
А мы не знаем: бери ab в руки и считай.
 

svetasmirnova

маленький монстрик
В поставку Apache2 входит. Утилита для бенчмарков web-приложений. Хелп там очень понятно написан.
 
Сверху