Новый материал: Кэширование ваших страниц в 5 шагов

kvf77

Red Devil
Новый материал: Кэширование ваших страниц в 5 шагов

Новый материал: Кэширование ваших страниц в 5 шагов

http://php.russofile.ru/ru/translate/unsort/caching_5_steps/

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

Alexandre

PHPПенсионер
Re: Новый материал: Кэширование ваших страниц в 5 шагов

Внутри .htaccess файла пропишите следующие строки: php_value auto_prepend_file /home/username/public_html/start_cache.php
php_value auto_append_file /home/username/public_html/end_cache.php
this code is not good
 

kruglov

Новичок
Совершенно очевидно, что в данном случае атрибуты 777 являются определенным нарушением безопасности. В связи с чем, рекомендую вынести папку cahce_files за пределы public_html, например, поместить ее на один уровень выше. Это закроет доступ к находящимся в ней файлам пользователей вашего сайта, но никак не повлияет на работоспособность системы.
Совершенно непонятно, как вынесение файлов за пределы public_html может компенсировать открытость их на запись.
 

kvf77

Red Devil
за рутом всетки труднее их достать :) как предлагает автор это ваще неправильно
 

camka

не самка
А еще стоит посылать соответствующий HTTP заголовки

-~{}~ 23.03.07 15:27:

http://ilia.ws/files/vancouver_cache.pdf
 

tf

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

aixrus

Новичок
tf
самому, это через

Код:
ob_start();
ob_implicit_flush(0);

<html вывод>

$contents = ob_get_contents();
ob_end_clean();
делали, знаем...

прелесть cache_lite
что он сам:
1. следит за блокировками файлов
2. умеет работать с объектами

например, если из базы данные выбираешь в массивы
можешь закешировать результат выполнения запроса (готовый массив), если посещаемость нормальная - первый выполнится как обычно, все остальные будут происходить в x10-x100 раз быстрее


разные подходы:
- когда сразу строишь страницу (тут можно и целиком ее в кеш)
- когда сначала выбираются все данные, а потом передаются в шаблонизатор, smarty, например - либо строиться на основе этого xml с последующим наложением xslt
 

aixrus

Новичок
ни в чем особо

повторюсь...

два разных подхода
- можно делать кеширование на уровне результата
- можно делать кеширование на уровне данных

- первый подходит, для кеширования готового html, всей страницы или ее части, когда ты код пишишь вперемешку с дизайном

второй, может делать тоже самое + кешировать объекты, что более универсальнее, так как работаешь с закешированными исходными данными, по которым можно еще раз пробежаться, добавить или изменить что-то

например, массив с 1000 строками
ты не тратишь время на его формирование, рассчет значений - считал из кеша и работаешь с ними

в первом ты такого не сделаешь - так как на выходе готовый html, кроме как вывести его на экран ничего другого не получиться
 

Андрейка

Senior pomidor developer
в первом ты такого не сделаешь - так как на выходе готовый html
действительно.. чет сразу не сообразил... побежал скачивать нашу прелесть ака cache_lite ... без него ж закэшировать результат запроса ну никак не получицца
 

aixrus

Новичок
по первому варианту, готовые функции и пример работы
PHP:
<?
////////////////////////////////////////
// Начинаем кэширование контента

$cached_file=md5($_SERVER['REQUEST_URI']); //имя файла для кеширования
$time_live=60*60*12; //12 часов (в секундах)
if(!$contents = readCache($cached_file, $time_live))
{

ob_start();
ob_implicit_flush(0);
////////////////////////////////////

//-------cut end --------------------

?>

ВЫВОД HTML  ВЫВОД HTML  ВЫВОД HTML  ВЫВОД HTML  ВЫВОД HTML 

<? 

//-----cut start ---------------------

////////////////////////////////////////
// кеширование окончание
$contents = ob_get_contents();
ob_end_clean();
writeCache($contents,$cached_file);

}
echo $contents;

////////////////////////////////////////

//-------cut end --------------------

?>
если нужно кешировать отдельный блок, то добавляй уникальное имя в название файла

$cached_file=md5("название блока".$_SERVER['REQUEST_URI']); //имя файла для кеширования


сами функции
PHP:
 /*
  * Запись кэш-файла
  * @param string contents - содержание буфера
  * @param string filename - имя файла, используемое при создании кэш-файла
  * @return void
  */
  function writeCache($content, $filename) {


  if (!file_exists("/tmp/cache/".encode_path($filename))) {
    if (!recursiveMkdir("/tmp/cache/".encode_path($filename))) {
    	}

   }

    $fp = fopen('/tmp/cache/' . encode_fullpath($filename), 'w');
    fwrite($fp, $content);
    fclose($fp);
  }

  /*
  * Проверка кэш-файлов
  * @param string filename - имя проверяемого кэш-файла
  * @param int expiry - максимальный <возраст> файла в секундах
  * @return mixed содержимое кэша или false
  */
  function readCache($filename, $expiry) {
    if (file_exists('/tmp/cache/' . encode_fullpath($filename))) {
      if ((time() - $expiry) > filemtime('/tmp/cache/' . encode_fullpath($filename)))
        return FALSE;
      $cache = file('/tmp/cache/' . encode_fullpath($filename));
      return implode('', $cache);
    }
    return FALSE;
  } 


function encode_fullpath($fname)
{
 $s1=substr($fname,0,1);
 $s2=substr($fname,-1);
 return $s1."/".$s2."/".$fname;
}

function encode_path($fname)
{
 $s1=substr($fname,0,1);
 $s2=substr($fname,-1);
 return $s1."/".$s2."/";
}

function recursiveMkdir($strPath, $mode = 0777) {
	return is_dir($strPath) or ( recursiveMkdir(dirname($strPath), $mode) and @mkdir($strPath, $mode) );
}
-~{}~ 25.03.07 13:01:

Андрейка

по второму, пример работы
работа с кешированием массивов решается все же через сериализацию, там вроде нет встроенных методов :)))

PHP:
<? 

// options
$options = array(
'cacheDir' => '/tmp/cache/',
'lifeTime' => 18000
);
$Cache_Lite = new Cache_Lite($options);

....




   $sql="SELECT * FROM table WHERE target='$mode'";
   $md5key=md5($sql);
	if ($res = $Cache_Lite->get("$md5key")) {
	     //проверили результат в кеше
	     $res=unserialize($res);
		
	} else {
		//пустой, делаем запрос и сохраняем в кеше
		$res=$db->get_results($sql,"ARRAY_A");
		$res_=serialize($res);
		$Cache_Lite->save($res_);

		}

		if (is_array($res)) {
                   //теперь в $res у нас массив с данными
                   //делаем цикл внутри этого блока

 ....


?>
 

tf

крылья рулят
$cached_file=md5("название блока".$_SERVER['REQUEST_URI']);
а если мне не нужно кешировать блок при разных значениях uri?
притом что блок зависит только от родиельской страницы
у меня разные блоки
например, массив с 1000 строками
жуть спасибо, я лучше клиенту 10 строк отдавать буду
вы уверены что файл, будет быстрее прочитать?
какие замеры были с каким данными и какие результаты?
по первому варианту, готовые функции и пример работы
и самое главное нафиг мне это надо
кому ты это писал, а главное зачем?
 

aixrus

Новичок
tf

URL в качестве ключа используется, чтоб на всех старницах одно и тоже содержание не было
если блок единственный - можно какое-нибудь постоянное наименование придумать


все временные файлы у меня на ram-диске, так что читаются очень быстро

если на физических размещать, то действительно очень много операций может возникать при больших нагрузках


производительность:

убыстренее на глаз заметны

первым способом - при ~ 30 тыс запросов страниц в сутки
в свое время количество запросов к БД с 80 в сек уменьшилось до 20-30 (mysql)

вторым - сложно сказать, там другая бд (postgres) и работа с очень большими данными, десятки миллионы записей
без кеширования может 8-30 сек выполняться, с кешированием 0.05-0.4
 

tf

крылья рулят
понятно
а что ты и впрям это код что написал используеш в своих проектах?

у меня другая архитектура, закешировал меню в админке - доволен, данных на 5кб в файле
а я то думал что она у меня медленно работает: 32ms, сейчас 3-4ms - нормально
PHP:
// кеширование данных
// записываем в кеш
function cache_set($name, &$data, $uri=false) {
	$file = path_cache_data . $name . class_pages::getMain() . class_pages::getItem() . ($uri ? urlencode($_SERVER['REQUEST_URI']) : '');
	file_put_contents($file, serialize($data));
}

// читаем из кеша
function cache_get($name, $uri=false) {
	$file = path_cache_data . $name . class_pages::getMain() . class_pages::getItem() . ($uri ? urlencode($_SERVER['REQUEST_URI']) : '');
	if($с=file_get_contents($file))
		return unserialize($с);
	return false;
}
 

kvf77

Red Devil
Хех, а говорили "вредная статья" - однако ж посмотрите какая не вредная оказалась - вытащила на свет интересные идеи :)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
для истории - файлы на RAM-диске использовать не стоит, лучше memcached или акселераторы вроде ZP/APC/XCache
 
Сверху