Архитектура простейшей CMS на PHP+MySQL

Предисловие


Очень лёгкая CMS может понадобиться в разных случаях. Например, если слабый сервер или нужно разместить очень много сайтов на одну железку с ограниченными ресурсами. К примеру, возьмём VDS начальной ценовой категории в $10/месяц. Можно туда поместить 100 сайтов на WordPress? Вряд ли! А можно поместить 100 сайтов на какой-нибудь лёгкой CMS'ке? Можно и даже больше! Данный пример ближе всего SEO'шникам.

Теория

Что нужно получить в итоге:
1. CMS должна работать с одной БД для нескольких сайтов.
2. CMS должна потреблять минимум оперативной памяти.
3. Админка:
— Список контента (редактирование, удаление).
— Операции с категориями (добавление, редактирование, удаление).
4. Лёгкая встраиваемость в любые шаблоны.

1. Одна БД для нескольких сайтов
Решается просто. При инсталляции все таблицы будут иметь свой префик. Например:
site1_content
site1_categories
site2_content
site2_categories
Таким образом, одна БД на слабом VDS может спокойно обслуживать несколько десятков сайтов, а то и более, в зависимости от количества контента.

2. Минимум потребления памяти
Всё очень просто. В CMS не будет никаких наворотов, только то, что нужно для работы. И так как основной контент — это текст, тяжести никакой не должно быть.

Админка
В админке никаких логинов, только пароль админа для аутентификации. Страница входа, страница со списком статей (справа от названия статей ссылки на редактирование и удаление), страница для работы с категориями (тот же принцип: добавить новую, отредактировать старую, а вот удаления не будет, об этом позже), страница добавления контента и ссылка «Выход».

Почему нельзя удалить категорию? Потому что в БД в таблице site1_content у каждой статьи есть поле category. Статьи из базы никуда не денутся, просто не будет отображаться категория со статьями и придётся редактировать статьи, меняя категорию.

Лёгкая встаиваемость в шаблоны
Достигается просто includ'ами. В данном примере инклуды файлов header.php, content.php, menu.php. Просто нужно вставить инклуд в нужно место. Header.php вверху, content и menu в соответствующие места. Вот и вся работа с шаблонами!

Файлы

Следующие файлы будут в поставке:
/site1/index.php < — единственный файл с дизайном, хорошо подходят css шаблоны, в него и нужно добавить инклуды
/site1/login.php < — страница ввода пароля админа
/site1/conf.php < — конфигурация, данные БД, md5 хэш пароля админа, данные сайта: title, description, keywords.
/site1/.htaccess < — если нужна своя особая структура ссылок
/site1/header.php < — здесь происходят все действия с БД
/site1/content.php < — вывод контента: если это страница, то выводим статью, если категория, то выводим список статей в этой категории, если главная страница, то выводим последние XX статей по дате или id
/site1/menu.php < — инклуд для вывода меню сайта
/site1/admin.php < — список статей
/site1/admin-edit.php < — редактирование и удаление статей (контента)
/site1/admin-cat.php < — работа с категориями

БД

Для начала в конфиге указываем данные для БД: user, base, host, pass, prefix (!)
Важно для каждой новой установки указывать уникальный префикс, иначе при новой инсталляции в одну базу данных могут пострадать уже существующие. Можно конечно написать проверку есть ли уже такие таблицы, но мы же ленивые.

Скрипт установки таблиц в БД сначала читает конфиг, а потом создаёт таблицы с префиксами:

$content=$prefix."content";
$categories=$prefix."categories";


Струтура таблиц примерно такая:

site1_content -> `id` INT(7) NOT NULL AUTO_INCREMENT PRIMARY KEY, `category` INT(3) NOT NULL, `title` VARCHAR(250) NOT NULL, `text` TEXT NOT NULL, `keywords` VARCHAR(250) NOT NULL, `date` VARCHAR(20) NOT NULL, `link` VARCHAR(250) NOT NULL)

link — это ссылка на источник контента. Мы ведь уважаем труд авторов статей?

site1_categories -> `id` INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(250) NOT NULL

Алгоритм CMS'ки

Header.php получает запрос (через GET переменные) и в зависимости от того, какая страница запрошена делает соответствующий запрос к БД + 1 запрос для меню. Далее данные сохраняются в переменных.

Menu.php циклом выводит меню.

Content.php циклом (если это index или category) выводит список статей (анонсами) или саму статью (если это content).

К слову о GET запросе. Это может выглядеть так: site1.tld/category.php?id=5 или так: site1.tld/category5/. Всё зависит от фантазии и .htaccess

Послесловие

Естественно не имеет смысла разбирать все аспекты до мелочей. Всё описанное не просто теория. У меня есть рабочая версия, которую я использую для SEO раскрутки своих СДЛ (сайтов для людей).

Практика показала, что потребление памяти всего 256Кб на скрипт. Одна база спокойно выдерживает на слабом VDS около 50 установок, в каждой из которых около 200 статей. Может быть может и больше, не тестировал отказоустойчивоть VDS'ки.

Спасибо за внимание!

P.S: мне нравится изобретать велосипед


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.