Кэширование

J
На сайте с 06.07.2011
Offline
169
422

Подскажите пожалуйта, как реализовать такое..

Есть много страниц, которые идут реврайтом на сервере (RewriteRule .* /page.html [L]).

К примеру есть ссылка: http://domain.com/несуществующаястраница.html - как сделать так что бы она кэшировалась в папку cache к примеру и при обращении уже грузилась оттуда, если соответственно не удалишь кэш.

L5
На сайте с 11.10.2009
Offline
65
La5
#1
jano:
Подскажите пожалуйта, как реализовать такое..
Есть много страниц, которые идут реврайтом на сервере (RewriteRule .* /page.html [L]).
К примеру есть ссылка: http://domain.com/несуществующаястраница.html - как сделать так что бы она кэшировалась в папку cache к примеру и при обращении уже грузилась оттуда, если соответственно не удалишь кэш.

Чего-то не понятна мне твоя задумка, в текущих исходных данных, у тебя все-все запросы перенаправляются на страницу page.html, зачем тебе её кешировать? Ну, т.е. это не мое дело наверно, но вместо того чтобы просто отдать страницу page.html, ты хочешь запустить скрипт, который проверит, есть ли она в кеше, если нет, создать её копию, и потом отдать. Другими словами, хочешь сделать больше нагрузку, чем она есть.

Либо ты что-то не дописал про mod_rewrite и правила которые там.

Если я Вам помог, не забывайте ставить + в карму!
J
На сайте с 06.07.2011
Offline
169
#2
La5:
Чего-то не понятна мне твоя задумка, в текущих исходных данных, у тебя все-все запросы перенаправляются на страницу page.html, зачем тебе её кешировать? Ну, т.е. это не мое дело наверно, но вместо того чтобы просто отдать страницу page.html, ты хочешь запустить скрипт, который проверит, есть ли она в кеше, если нет, создать её копию, и потом отдать. Другими словами, хочешь сделать больше нагрузку, чем она есть.

Либо ты что-то не дописал про mod_rewrite и правила которые там.

В page.html идёт генерация десков и кейвордов. Что бы каждый раз поисковику не открывалась страница с новым контентам, хотел бы я кэшировать не существующие страницы.

L5
На сайте с 11.10.2009
Offline
65
La5
#3
jano:
В page.html идёт генерация десков и кейвордов. Что бы каждый раз поисковику не открывалась страница с новым контентам, хотел бы я кэшировать не существующие страницы.

судя по всем page.html, это скрипт какой-то, тогда тебе надо его изменить вот по такой логике:

<?php

function isPageExists($pageId)
{
$isExists = false;

// тут у тебя проверка существует такая страница или нет

return $isExists;
}

// генерирует путь к файлу кеша
function getCacheFilePath($pageId)
{
return 'cache/'.$pageId;
}

// проверяет есть ли страница в кеше
function isPageInCache($pageId)
{
$cacheFilePath = getCacheFilePath($pageId);
return is_readable($cacheFilePath);
}

// возвращает содержимое файла кеша
function getPageFromCache($pageId)
{
$cacheFilePath = getCacheFilePath($pageId);
return file_get_contents($cacheFilePath);
}

// сохраняет страницу в кеш
function savePageToCache($pageId, $html)
{
$cacheFilePath = getCacheFilePath($pageId);
$dir = dirname($cacheFilePath);
if (!is_dir($dir)) mkdir($dir, 0755, TRUE);
return file_put_contents($cacheFilePath, $html);
}

// генерируем уникальный Id страницы
$pageId = md5(json_encode($_REQUEST));

if (!isPageExists($pageId))
{
// страница не существует, значит надо кешировать
if (isPageInCache($pageId))
{ // если есть страница в кеше

// читаем её из кеша
$html = getPageFromCache($pageId);

}
else
{ // Если страницы нет в кеше

// генерируем страницу
ob_start();
?>
Some page contents, current time <?=date('H:i:s');?>
<?php
$html = ob_get_clean();

// сохраняем в кеш
savePageToCache($pageId, $html);

}
echo $html; // и выводим
}

Только, учти еще один момент, если запросов много, тогда лучше кешировать не в папку, а в базу. Т.к. на хостингах, да и вообще в линуксе, есть ограничение на кол-во файловых дескрипторов (кол-во файлов). Это конечно большое число, но я его достигал, и долго не мог понять в чем причина вылезшей проблемы. В общем если ты сейчас знаешь, что у тебя, планируется от 100.000 файлов кеша, то лучше сразу создать простую key-value табличку и хранить кеш там.

J
На сайте с 06.07.2011
Offline
169
#4
La5:
судя по всем page.html, это скрипт какой-то, тогда тебе надо его изменить вот по такой логике:

<?php


function isPageExists($pageId)
{
$isExists = false;

// тут у тебя проверка существует такая страница или нет

return $isExists;
}

// генерирует путь к файлу кеша
function getCacheFilePath($pageId)
{
return 'cache/'.$pageId;
}

// проверяет есть ли страница в кеше
function isPageInCache($pageId)
{
$cacheFilePath = getCacheFilePath($pageId);
return is_readable($cacheFilePath);
}

// возвращает содержимое файла кеша
function getPageFromCache($pageId)
{
$cacheFilePath = getCacheFilePath($pageId);
return file_get_contents($cacheFilePath);
}

// сохраняет страницу в кеш
function savePageToCache($pageId, $html)
{
$cacheFilePath = getCacheFilePath($pageId);
$dir = dirname($cacheFilePath);
if (!is_dir($dir)) mkdir($dir, 0755, TRUE);
return file_put_contents($cacheFilePath, $html);
}

// генерируем уникальный Id страницы
$pageId = md5(json_encode($_REQUEST));

if (!isPageExists($pageId))
{
// страница не существует, значит надо кешировать
if (isPageInCache($pageId))
{ // если есть страница в кеше

// читаем её из кеша
$html = getPageFromCache($pageId);

}
else
{ // Если страницы нет в кеше

// генерируем страницу
ob_start();
?>
Some page contents, current time <?=date('H:i:s');?>
<?php
$html = ob_get_clean();

// сохраняем в кеш
savePageToCache($pageId, $html);

}
echo $html; // и выводим
}

Огромное спасибо, протестирую.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий