Разработка CMS шаг за шагом
Давно известная истина – учиться лучше всего на чужих примерах. Программированию, в частности, хорошо учиться, роясь в исходниках работающих программ. Можно заодно попытаться оценить рациональность, найти недостатки, взять на вооружение удачные решения. Анализ исходников – это заочный обмен опытом.
Вот для такого обмена опытом приглашаю вас познакомиться с разработкой несложной CMS – системы управления контентом для сайта. Мы рассмотрим весь ход разработки «движка» поэтапно.
Планируем возможности и структуру CMS
Что нам нужно от системы управления контентом? Что она должна «уметь»?
- строить структуру сайта как минимум в двух уровнях («раздел – подразделы»);
- вводить и корректировать содержание страниц (включая заголовки и мета-теги);
- строить карту сайта;
- подключать для некоторых страниц дополнительные скрипты (plug-in);
- включать в меню сайта скрипты сторонних разработчиков (форум, например);
На самом деле, не так уж и много. Разумеется, нам хочется, чтобы всё это действовало надежно, быстро и не слишком «напрягало» сервер, на котором будет работать. Хотелось бы иметь возможность без лишней возни сменить дизайн страниц, когда это понадобится. Еще нам не помешали бы так популярные сейчас псевдостатические URL'ы (Понятия не имею, почему их так упорно называют ЧПУ – от того, что в них нет знаков ?&=, они человеку понятнее не становятся. Приятнее – пожалуй, да).
Выбираем формат данных
В качестве хранилища информации предлагаются текстовые файлы. Да, вы всё правильно прочли. На самом деле область применения баз данных – вовсе не создание типовых сайтов. Я уже вижу кривые усмешки персонажей, которые не написали за свою жизнь ни одного движка, но «точно знают», чем Joomla лучше CMSimple. Предлагаю этим «знатокам» оставаться при своих заблуждениях. С оставшимися продолжим беседу. :-)
Создатели известной файловой CMS «CMSimple» признают, что их система способна довольно сильно нагрузить сервер при объеме контента от 2 мегабайт. Но это их собственная непредусмотрительность – нужно было тщательнее продумывать структуру данных.
Открою секрет – здесь будет описан движок-прототип, на более развитой версии которого работает этот сайт. При тестировании этого движка были взяты тексты 8 романов общим объемом в 3.5 мегабайта, разбиты на главы и использованы в качестве наполнения сайта (одна глава – одна страница). Всего получилось около 500 страниц. Скорость загрузки любой из них заведомо выше, чем при использовании базы данных. А нагрузка на сервер заведомо ниже. Больше того – это преимущество сохранится, если страниц будет пять тысяч.
Маленькое пояснение. Для тех, кому не понятно, почему это так.
База данных MySQL использует по 3 файла на каждую таблицу (файл данных, файл индексов и файл структуры). Поэтому для выборки, например, текста страницы приходится выполнять следующий набор операций:
- установить соединение с SQL-сервером;
- передать ему логин, пароль, имя базы;
- передать SQL-запрос и ожидать результата. Дальше действия SQL-сервера:
- интерпретировать SQL-запрос, найти в нем имя таблицы, поля и идентификатор записи;
- открыть все три файла нужной таблицы;
- считать список полей из файла структуры;
- считать нужный индекс из файла индексов;
- отыскать в индексе идентификатор нужной записи и место ее расположения в файле данных;
- считать с найденной позиции файла данных нужное количество данных;
- разбить эти данные по запрошенным полям в ассоциативный массив;
- закрыть файлы;
- передать полученный массив скрипту;
- по команде скрипта закрыть соединение;
- затем скрипт выберет данные из массива по списку полей.
В случае хранения контента страницы в виде текстового файла операций намного меньше:
- открыть файл с заранее известным именем;
- считать все его содержимое как одну строку;
- закрыть файл;
- преобразовать строку в массив в соответствии с известной структурой данных.
Заметьте, здесь описан не набор строк скрипта, а набор операций, которые исполняет сервер. Не нужно потрясать исходниками, где эти действия уложены в большее или меньшее количество строк кода. Мы сейчас рассматриваем не число строк кода, а его эффективность – то есть надежность и быстродействие.
В случае движка с базой данных мы имеем 2 компонента – интерпретатор PHP, работающий как модуль web-сервера и SQL-сервер, который может быть отдельным процессом на том же физическом сервере, а может обслуживать множество аккаунтов виртуального хостинга на отдельном сервере баз данных. Бывает так, что SQL-сервер сильно нагружен или просто «свалился» и не отвечает. Очевидно, что надежность такой связки ниже.
Файлы с текстами лежат здесь же, в дисковом пространстве сайта в пределах досягаемости скриптов. Открытие и чтение их – элементарные системные операции, такие же быстрые, как подключение фрагмента кода из файла директивой include. Главное – не сваливать тексты всех страниц в один файл, как сделали создатели CMSimple, а то он займет слишком много места и в нем неудобно и долго будет рыться.
В любом случае, это только пример. Те же подходы к структуре данных и проектированию движка можно использовать и в случае со связкой PHP+MySQL. Эта связка просто необходима при строительстве совсем не простых сайтов, начиная с уровня развитого форума или интернет-магазина. Но сейчас перед нами стоит задача попроще, а предисловие, как мне кажется, снова затянулось... ;-)