У меня есть сервис, который предоставляет 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 в вашем конкретном случае, но на тот случай, если у вас есть свободные ГБ ОЗУ.