Создание статических HTML файлов из базы данных

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

Вместо того, чтобы динамически генерировать каждый поток каждый раз, когда он просматривается, я думал о создании статической версии каждого потока, который будет перезаписан в любое время, когда будет создан новый пост. Каждый поток будет храниться в папке /html/forum, а потоки, которые не были отредактированы за 3 или более дней, будут перемещены в папку /html/forum/archive (поэтому file_exists не нужно искать через 5000 html файлы каждый раз для широко просматриваемых потоков).

Вот пример того, как будет выглядеть новая страница нити:

require_once('header.php');
if(file_exists('/html/forum/'.$thread_id.'.html'))
{
 require_once('/html/forum/'.$thread_id.'.html');
}
elseif(file_exists('/html/forum/archive/'.$thread_id.'.html'))
{
 require_once('/html/forum/archive/'.$thread_id.'.html');
}
else
{
 //display something about how the thread doesn't exist
}
require_once('footer.php');

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

Спасибо!

2 ответа

Использование статических файлов, подобных этому, совсем не плохая идея, но не надо беспокоиться о поддиректории архива. Вместо этого разделите кешированные файлы на поддиры с помощью некоторого абстрактного значения, такого как последняя цифра идентификатора потока или первые два символа хеша md5() идентификатора потока. Итак, вы получаете:

/1/121.html
/1/301.html
/2/92.html
/3/13.html

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

/2/1/121.html
/0/1/301.html
/9/2/92.html
/1/3/13.html

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


Я бы обычно придерживался динамического создания страниц, потому что если у вас есть, скажем, поток с 10 страницами, вам придется поймать множество событий, которые инициируют обновление кеша. Они не ограничиваются только новым постом. Вам придется поймать все операции CRUD на сообщениях. Представьте обновление кеша, если некоторые сообщения на странице 1 удаляются. Более того, статистика пользователя (количество сообщений общего числа, статус онлайн и т.д.) Обычно должно быть свежим для зрителей. Поэтому мое видение заключается в том, что преимущество производительности здесь не стоит.

licensed under cc by-sa 3.0 with attribution.