Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Псевдо-кэширование на сервере 
:(
    Опции темы
Mal Hack
Дата 1.2.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Статья вот тут: http://vingrad.ru/PHP-ART-003003
Обсуждение ниже.
PM ICQ   Вверх
Opik
Дата 18.5.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 3
Всего: 55



Mal Hack
Мало, ни memcache, ни Pear:Cache толком ничего нету  
PM MAIL Skype   Вверх
Mal Hack
Дата 18.5.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Это несколько другое. PEAR я не воспринимаю в принципе. 
PM ICQ   Вверх
-=Ustas=-
Дата 18.5.2006, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: нет
Всего: 69



Цитата(Opik @  18.5.2006,  17:39 Найти цитируемый пост)
 ни memcache

Не мог бы малость просветить по этому поводу?!

Mal Hack, такой подход естественно не имеет смысла. Имеет смыл когда контент генерится блоками, и затем эти блоки кэшируются... Лично у меня такой подход... 


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Mal Hack
Дата 19.5.2006, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Цитата(-=Ustas=- @  18.5.2006,  22:43 Найти цитируемый пост)
Mal Hack, такой подход естественно не имеет смысла. Имеет смыл когда контент генерится блоками, и затем эти блоки кэшируются... Лично у меня такой подход...  

Да, это хороший подход. Но не сразу люди видят, как все на блоки разбить, а статья должна дать в данном случае общий алгоритм.
Кстати на счет блоков, не всегда факт.. К примеру есть блок верхней панельки, который зависит от пользователя. Как быть в таком случае?
Да, можно разбить  все на более мелкие блоки, но ИМХО, это не удобно. 
PM ICQ   Вверх
Opik
Дата 19.5.2006, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 3
Всего: 55



Mal Hack
Не сказал бы, что это другое.
Насчет не воспринимаешь - вот это другой вопрос, раз взялся писать статью про кеширование, ты должен это сделать непредвзято. Делая не полную статью, ты можешь ввести в заблуждение читателей.

-=Ustas=-
http://ee.php.net/memcache
Если коротко: хранение данных в памяти, может использоваться как кеширование. Подробнее по ссылке выше.

Туда же:
http://ee.php.net/apc
http://ee.php.net/shm
http://pear.php.net/package/Cache
http://pear.php.net/package/Cache_Lite 
PM MAIL Skype   Вверх
-=Ustas=-
Дата 19.5.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: нет
Всего: 69



Цитата(Mal Hack @  19.5.2006,  00:06 Найти цитируемый пост)
К примеру есть блок верхней панельки, который зависит от пользователя. Как быть в таком случае?

Элементарно, у меня хеш-ключи для имен файлов кеша формируются из данных: URI, текущая page (если она есть), и если пользователь зареган, то естественно и его id-ишник цепляется. Т.е. перекрестного подцепления не может быть в принципе.

Цитата(Mal Hack @  19.5.2006,  00:06 Найти цитируемый пост)
Да, можно разбить  все на более мелкие блоки, но ИМХО, это не удобно.  

Ну это смотря как посмотреть, и смотря какой подход использует сам программист. Например у меня свой класс шаблонов (простой, но работает так как мне надо), он у меня работает с html-шаблонами, в которых хтмл и дескрипторы вида {PANEL}. Т.е. у меня идет блочное формирование, поэтому проблем и запутывания абсолютно нет, все ясно и понятно smile В кратце, допустим есть страница:
Код

<HTML>
<head>
    <title>{TITLE}</title>
</head>
<body>
<table>
    <tr><td>
        {RANDOM}
    </td></tr>
    <tr><td>
        {PANEL}
    </td></tr>
    <tr><td>
        {CONTENT}
    </td></tr>
</table>
</body>
</HTML>

У нас есть три блока, которые заменяются другими блоками подключенных html-шаблонов.
Код

<?php
// index.php

$keyCache = (empty($_SERVER['QUERY_STRING'])) ? 'index' : $_SERVER['QUERY_STRING'];
$keyCache .= (isset($_SESSION['userID'])) ? $_SESSION['userID'] : '';

// Есть методы GetElementCache и MakeElementCache, которые формируют из переданного ключа хеш и проверяют имя файла

// Мы получили этот шаблон $_CONTENT_TMPL
// Теперь нам надо сформировать три блока контента для последующей замены в шаблоне
$_RANDOM_BLOCK  = '';
$_PANEL_BLOCK   = '';
$_CONTENT_BLOCK = '';

// {RANDOM} - получаем его без кеша, т.к. он нам нужен живой, хотя функция GetElementCache принимает 
// параметр - время в минутах (время хранения), можно поставить минут 10, этого достаточно будет, ну да ладно

if (!$_PANEL_BLOCK = GetCacheElement('panel-blocks', $keyCache, 60)) {
    // допустим функция GetCacheElement возращает контент файла кеша, в противном случае FALSE
    // если этот файл уже старый, то функция удаляет его и возращает FALSE
    // если данного файла нет, то формируем этот блок
    ...
    ...
    ...
    ...
    // Сформировали, теперь надо его закешировать
    // при условии что контент поблочный, таким образом $_PANEL_BLOCK 
    // содержит готовый сгеренеренный хтмл
    MakeCacheElement('panel-blocks', $keyCache, $_PANEL_BLOCK);
    // функции передаем имя для файла, ключ для файла, и сам контент блока
    // в итоге у нас получается файлик с именем panel-block-8df17c77af23061ef4322d47d6c431fa.cache
    // который уже при обновлении текущей страницы уже подключиться выше, и генерация контента уже выполняться не будет
    // Все, кеш для данного блока готов
}

...
...
...
// Остальные блоки

// Т.е. вся работа делается с помошью двух функций
// Далее идет замена дескрипторов на блоки и все готово

?>


Конечо, такой подход может показаться на первый взгляд немного муторным, но я уже привык и практически не замечаю этого smile
Зато сервак разгружает очень даже заметно! 


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
AztEK
Дата 20.5.2006, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 723
Регистрация: 4.1.2005

Репутация: нет
Всего: 18



-=Ustas=-,  а как быть с блоками, которые сами по себе генерируются рандомно (типа "случайная новость" и проч.)? И ещё, какая логика у скрипта, управляющим кешированием? В каком случае страница убирается из кеша?

Добавлено @ 08:26 
Виноват, не страница а блок. 


--------------------
Linux is like wigwam -- no windows, no gates, apache inside.
PM MAIL Jabber   Вверх
-=Ustas=-
Дата 20.5.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: нет
Всего: 69



Цитата(AztEK @  20.5.2006,  08:26 Найти цитируемый пост)
-=Ustas=-,  а как быть с блоками, которые сами по себе генерируются рандомно (типа "случайная новость" и проч.)? 

Я же упомянул об этом smile Такие блоки в кэш не помещать просто напросто.
Цитата(AztEK @  20.5.2006,  08:26 Найти цитируемый пост)
И ещё, какая логика у скрипта, управляющим кешированием? В каком случае страница убирается из кеша?

У меня лично по времени. Но можно дописать что-то вроде проверки контрольной суммы, тогда кэш будет очищаться не по времени, а на момент изменения документа. 


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
IZ@TOP
Дата 6.6.2006, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



Сейчас появилась интересная тема использования перенаправляющих легких HTTP серверов типа nginx. Советую почитать по этой теме. 


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Empirik
Дата 8.9.2006, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 28.10.2005
Где: Россия, Пермь

Репутация: нет
Всего: 1



Форумчане, по поводу кеширования, скажите пожалуйста, можно ли перехвотить вывод в стандартный поток в php? Ну тоесть перехватить данные которые уходят при помощи вызова функций print и echo ? 
--------------------
Постоянно удивляюсь человеческой фантазии напридумывают гаджетов
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 8.9.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Empirik, а я о чем в статье писал???
PM ICQ   Вверх
Empirik
Дата 10.9.2006, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 28.10.2005
Где: Россия, Пермь

Репутация: нет
Всего: 1



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

Стандартный процесс кеширования
Код

$pagebody="";//переменная в котору

$pagebody='<table width="100%">';//собираем страницу или блок 
//....

$pagebody='</table>';

fwrite($fd,$pagebody);//кешируем страницу или блок

print $pagebody//Выводим пользователю


А хотелось бы что бы кеширование производилось следующим образом 

Код

start_cache("some_file_name");//начинаем кеширование

print '<table width="100%">';//собираем страницу или блок 
//....

print '</table>';

end_cache();//заканчиваем кеширование

--------------------
Постоянно удивляюсь человеческой фантазии напридумывают гаджетов
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 10.9.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Empirik, читай статью внимательно. Я писал именно о том, КАК ПЕРЕХВАТИТЬ САМ ВЫВОД...
Никаких переменных у меня там нет.
PM ICQ   Вверх
Vaulter
Дата 10.9.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: нет
Всего: 22



Empirik, читай про
ob_start();
ob_end_flush();
ob_list_handlers(); например еще smile


--------------------
PM MAIL WWW ICQ   Вверх
Empirik
Дата 10.9.2006, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 28.10.2005
Где: Россия, Пермь

Репутация: нет
Всего: 1



Код

ob_start();    
// Тут идет работа скрипта. Т.е., если файла нет,    
// то пользователю будет сгенерирована страница с информацией.    
Print $content;    
$str = ob_get_contents(); // получаем в переменную то, что сгенерировал скрипт.    
/* Создаем кэш файл */    
$f = fopen( «.......» , «w» );    
fwrite( $f , $str );    
fclose( $f );    
ob_end_flush();


Можешь привести код работы функций ob_start() и ob_end_flush() и как я понял, строку 
Print $content; - ты просто написал для примера?

Добавлено @ 12:22 
Всем спасибо разобрался
--------------------
Постоянно удивляюсь человеческой фантазии напридумывают гаджетов
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 10.9.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Цитата(Empirik @  10.9.2006,  13:19 Найти цитируемый пост)
Print $content; - ты просто написал для примера?

Да. Это любой вывод в STDOUT.
PM ICQ   Вверх
Eugene_Bond
Дата 10.9.2006, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 3.9.2006

Репутация: 1
Всего: 4



добавлю свои 5 копеек

Цитата

Минус этого подхода, что он сильно ограничит возможности нашего движка и сайта в целом. Нам уже не будет так легко сменить дизайн или в «шапке» вставить новый логотип. Т.е. система получается не универсальной.

использование shtml тут поможет. судя по всему такой способ генерации контента остается наиболее подходящим для новостных порталов и прочих аналогичных сайтов расчитаных на большую нагрузку.
чем генерить статику и управлять ей - это уже детали..

Это же касается "частичного" кеширования страницы ("Тут надо несколько усложнять, и делать кэш частичный, т.е. все что было описано выше надо проделать только над той частью, которая генерирует основной контент").


Ну и главное:
есть тот же Смарти, который замечательно решает все эти вопросы. Как кеширование отдельных шаблонов, так и запрет на кеширование отдельных частей закешированных шаблонов.
PM MAIL   Вверх
ST_Falcon
Дата 1.11.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 14.11.2003
Где: Львов

Репутация: нет
Всего: 1



Mal Hack, ИМХО для твоего уровня статья слабенькая... все очень поверхносно, не описаны механизмы кеширования в Smarty, PEAR Cache, PEAR Cache Lite. еще было бы очень интересно посмотреть на сравнение производительности при использовании различных инструментов кеширования...
PM MAIL ICQ   Вверх
Mal Hack
Дата 1.11.2006, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Цитата(ST_Falcon @  1.11.2006,  16:14 Найти цитируемый пост)
все очень поверхносно, не описаны механизмы кеширования в Smarty, PEAR Cache, PEAR Cache Lite.

А я и не ставил себе такую задачу. Я ставил задачу показать возможности и простейший алгоритм для релизации своего кэширующего механизма.
PM ICQ   Вверх
vdim
Дата 31.8.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 19.4.2008

Репутация: нет
Всего: нет



где статью-то можно почитать?
Ссылка перенаправляет на http://forum.vingrad.ru/faq/topic-82069.html , где одни комментарии.
PM MAIL   Вверх
Mal Hack
Дата 31.8.2008, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



PM ICQ   Вверх
Sanchezzz
  Дата 30.6.2009, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 2
Всего: 60



может не к теме немного но вот мой велик на кеш данных:

Код

class cache {
    public  $cache_dir;   // путь до папки с кэшем
    private $time;
    private $lastCache; // последние данные c которыми работали.
    
    public function __construct(){
        $this->cache();
    }

    public function cache(){
        $this->cache_dir = $_SERVER['DOCUMENT_ROOT']."/cache/";
        if(!is_dir($this->cache_dir)){
            mkdir($this->cache_dir , 0755);    
        }
        $this->time = time();        
    }
    // Получить кэш
    public function GetCache($keyName){
        if(file_exists( $this->cache_dir . md5($keyName).".cache"))
            $cache_content = $this->FileRead($this->cache_dir .md5($keyName).".cache" );            
        if(strlen($cache_content)>0)
            $cacheData = unserialize($cache_content);
            else $cacheData = "";
            $this->lastCache = $cacheData;
        return $cacheData;    
    }
    //функция проверяет дату обновления и если вообще кэш
  
    public function isCache($keyName , $timeMinus = 0){
        if(file_exists( $this->cache_dir . md5($keyName).".cache")){
            $cache_content = $this->FileRead($this->cache_dir . md5($keyName).".cache");
            $cacheData = unserialize($cache_content);
            $this->lastCache = $cacheData;
            if((time() - $timeMinus) >= $cacheData['update_time']) return false; else return true;            
        }
        return false;
    }
    
    // Получить временный кэш c которами работали.
    public function GetLastTmpCache(){
        return $this->lastCache;
    }    
    // Записывает кэш
    public function SetCache($var, $keyName , $time = 3600){        
        $cacheData = array();
        //$scalar = is_scalar($var);    
        $cacheData = array(
            'data'=> $var ,                    // данные
            'time'=>$this->time,              // последние изменения
            'update_time'=>$this->time + $time // когда должно обновится
        );                
        $cache_content = serialize($cacheData);    
        $this->FileWrite($this->cache_dir . md5($keyName).".cache" , $cache_content);    
    }
    // Очистить весь кэш
    public function ClearALLCache(){
        $handle = opendir($this->cache_dir);
         while($file = readdir($handle)) {
          if(is_file($file)) unlink($file);        
         }
         closedir($handle);
    }
    // Удалить кэшь по параметру
    public function ClearCache($keyName){
        if($keyName=='') return false;
        $keyName = md5($keyName);
        if(file_exists($this->cache_dir .$keyName )){
            unlink( $this->cache_dir . $keyName );
            return true;
        }
        return false;
    }
    // Открыть файл
    public function FileRead($path){
            clearstatcache(); //нужно
            if(!file_exists($path) || !is_file($path) || !is_readable($path) ) return false;
             if(filesize($path)<=0) return "";
                 $fd = fopen($path, "rb");
                 $contents = fread ($fd, filesize($path));
                 fclose ($fd);
            return $contents;
    }    
    // Перезаписать файл
    public function FileWrite($path, $contents , $unlock = false, $chmod = 0755){
            if(file_exists($path)) chmod($path,$chmod);
            if($file = fopen($path, "w+")){
                  if($unlock!=false) flock($file, LOCK_EX);
                    fwrite($file, $contents);
                  if($unlock!=false) flock($file, LOCK_UN);
                    fclose($file);
                    chmod($path,$chmod);
                    return true;
             } else return false;
    }

}


как пользоватся:
Код

$cache = new cache(); // вызов класса
$writecache = false;

// эта функция проверят если кеш, если есть то берем его и заполняет временный кеш класса.
// если нету то заполняет кеш новыми данными
// _RESULTS_  это для поиска среди кешевых файлов. 
if(!$cache->isCache('_RESULTS_') ){
    $arr = array();
    mysql_connect('localhost','root','');
    mysql_select_db('CMS');
    $res = mysql_query('SELECT * FROM `block_items` WHERE 1');
    
    while ($row = mysql_fetch_assoc($res)):
        $arr[] = $row;
    endwhile;
    //записываем кеш    
    $cache->SetCache($arr, '_RESULTS_');
  $writecache = true; 
}else

// так как вверху используется кашировла проверка isCache
// которая проверяет если кеш, если дата старая то вносим данные новые и заполняем времменный кеш класса

$arr = $cache->GetLastTmpCache(); // отдаем обратно кеш.

print_r($arr);


Минусы и плюсы в этом методе решать вам. 

Это сообщение отредактировал(а) Sanchezzz - 30.6.2009, 07:44


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Elfet
Дата 24.1.2010, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



а где статья? smile


--------------------
PM MAIL WWW Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1166 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.