Назад | Перейти на главную страницу

Более быстрый метод кеширования

У меня есть сервис, который предоставляет HTML-код, который в какой-то момент больше не обновляется. Код всегда генерируется динамически из базы данных с 10 миллионами записей, поэтому каждый рендеринг страницы кода HTML ищет там, скажем, 60 или 70 этих записей, а затем отображает страницу.

Итак, для этих просроченных страниц я хочу использовать систему кеширования, которая будет ОЧЕНЬ простой (например, просто введите запись с визуализированным HTML и (если мне нужно) удалите ее).

Я попытался сделать это на основе файлов, но поиск наличия файла и его последующая передача через php для его фактического рендеринга кажется слишком сложным для того, что я хочу сделать.

Я думал сделать это на mysql с таблицей с MEDIUMBLOB (каждая страница около 100k). Таких рекордов было бы около 150000 (по крайней мере, пока).

Мой вопрос: было бы быстрее позволить mysql выполнять поиск файла и переход на php, или подход на основе файлов быстрее?

Код поиска для файловой версии выглядит следующим образом:

$page = @file_get_contents(getCacheFilename($pageId));
if($page!=NULL) {
    echo $page;
} else {
    renderAndCachePage($pageId);
}

который выполняет один поиск независимо от того, находит он файл или нет.

Таблица mysql будет иметь только идентификатор (идентификатор страницы) и запись большого двоичного объекта.

Диск системы представляет собой простой SATA raid 1, демон mysql может захватить до 2,5 ГБ памяти (у меня тоже работает прокси-сервер, съедающий остальные 16 ГБ машины).

В общем, диск уже довольно занят.

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

Любой указатель того, в каком направлении мне следует двигаться, будет очень приветствоваться.

Спасибо!

который в какой-то момент больше не обновляется

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

$minquiet=86400; // 1 day
$scale=1;
$ago=filemtime($file);
$cache=(time()-$ago - $minquiet)/$scale;
if ($cache<0) $cache=0;
header("Cache-control: max-age=$cache; must-revalidate");

Вопрос о том, работает ли база данных mysql или файловая система быстрее, является более сложным.

Какая файловая система?

Находятся ли файлы в иерархии каталогов или все в одном каталоге? Если последнее, могут ли все они быть в одном каталоге?

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

$page = @file_get_contents(getCacheFilename($pageId));

OMG - это даст действительно плохую производительность. По крайней мере, измените его на stat () + readfile ().

$page = @file_get_contents(getCacheFilename($pageId));
if($page!=NULL) {

Означает ли это, что вы определяете, является ли страница кешируемой, в зависимости от того, является ли она экзостом или нет? Если да, то поменяйте местами, чтобы URL-адрес указывал на то, где должен быть файл, и реализуйте код PHP в обработчике 404.

Я бы порекомендовал использовать memcached в вашем конкретном случае, но на тот случай, если у вас есть свободные ГБ ОЗУ.