Начинающий веб-разработчик обычно не знает многих тонкостей, связанных с проектированием программной структуры сайта. Поэтому отмечу основные пункты, которые следует учитывать.
1. Все обращения пользователей к страницам сайта должны осуществляться через один индексный файл, а в нем уже происходить подключения остальных файлов в зависимости от страницы, которую запрашивает пользователь. Это позволит централизовано определить общие переменные для всего сайта, подключить файлы функций, инициировать старт сессии, подключение к базам данных и т.д. Для реализации подобной структуры на сервере апач используется mod_rewrite.
Данная схема может не распространяться на некоторые внешние скрипты, типа форумов, досок объявлений, которые не способны работать таким образом. Для них нужно настроить исключения.
2. Страницы сайта рекомендуется объединить в разделы и подразделы, сайт, таким образом, будет иметь древовидную структуру. Логично распространить ее и на адреса страниц, ведь пользователю понятнее "папочная" структура ссылок, а не строки с параметрами, типа http://www.mysite.ru/?acticle_id=5. Также, в адресе лучше использовать слова, отражающие название статьи (возможно, в транслитерации), это полезно для SEO. Поэтому ссылки у нас будут выглядеть так:
http://www.mysite.ru/acticles/ – список статей
http://www.mysite.ru/acticles/koe-chto-o-pitanii-homyachkov/ – конкретная статья
http://www.mysite.ru/new/ – список новостей
http://www.mysite.ru/new/5/ – конкретная новость, можно вместо идентификатора "5" использовать и заголовок новости, в этом случае придется следить за их уникальностью
3. Css- и javascript-код нужно стараться максимально вынести во внешние файлы. Это поможет разделить структуру сайта на логические части, уменьшить трафик и упростить его индексацию поисковыми роботами.
4. Весь вывод в браузер пользователя должен происходить в самом конце сценария, уже после формирования контента и завершения работы с БД. Для этого можно было бы собирать вывод в строку, однако, это не очень удобно, поэтому лучше перед формированием контента включить буферизацию вывода запуском функции ob_start(), а после сохранить все содержимое буфера в переменную вызовом ob_get_clean().
Правило выше означает, что любая строка в url после корня, состоящая из букв латинского алфавита, цифр, символов "_", "/" ,"-", ":" передается на обработку index.php. Предполагается, что все ссылки у нас будут состоять из этих символов. Символ точка среди них не указываем, чтобы обработка файлов, например robots.txt, производилась обычным способом
Это правило указывает, что если в url после корня оказалось "index.php" – рерайта ссылки не происходит, а обработка передается индексному файлу. Таким образом, параметр [L] выводит строку из под действия mod_rewrite
Допустим, мы хотим настроить исключение для запуска форума. Если url после корня начинается с "forum", запрещаем рерайт (как и в предыдущем правиле используем параметр [L]) – обработка осуществляется обычным способом в зависимости от того, что идет дальше в строке ссылки.
Данное правило запрещает выполнение файлов с расширением .php и .html, оно, как и раньше, передается файлу index.php. Поэтому при запуске /articles.php даже если такой файл существует, будет исполнен index.php и как показано дальше выведется ошибка 404. Это нужно, чтобы исключить возможность запуска пользователем промежуточных файлов и, таким образом, повысить надежность сайта.
Эти строки определяют, какие страницы показывать пользователю в случае возникновения ошибок с соответствующими кодами.
Теперь разберемся с организацией файлов на сервере. Пускай все общие файлы у нас лежат в папке /common/. Директория /common/scripts/ будет хранить файл функций phpfuncs.php и конфигурационный файл config.php, директория /common/html/templates/ – все html-шаблоны, /common/html/сss/ и /common/html/js/ соответственно css- и js- файлы. В папке /sections/ у нас будут директории разделов, например, /sections/articles/ станет директорией с разделом "Статьи".
Выделим три глобальные переменные-массива: $CONFIG – конфигурация сайта, $SCRIPT – вся информация, касающаяся текущего сценария, и $USER – массив данных пользователя, который запускает сценарий. К сожалению, в php нет возможности централизованно определить область видимости переменной, поэтому нам придется объявлять их глобальными в каждой функции, где они могут понадобиться при помощи оператора global.
Создадим в корне файл /index.php. Далее все понятно из комментариев, объясню только основные моменты. В index.php мы подключаем файлы phpfuncs.php и config.php, устанавливаем параметры кодировки, стартуем сессию, подключаемся к БД, идентифицируем пользователя, беря информацию о нем из баз данных и формируем контент $SCRIPT['html_content']. В самом конце идет запуск функции завершения сценария, которая осуществляет вывод.
Файл функций /common/scripts/phpfuncs.php, содержит также функции работы с базами данных. Родные функции php для работы с БД, например, mysql_query, лучше запускать не напрямую, а через "обертку". Это позволит легко переключаться при необходимости из режима mysql в mysqli и обратно, считать количество запросов в сценарии для статистики, выводить ошибочные запросы на экран, если включен режим отладки и т.д.
$SCRIPT['http_headers'][]='HTTP/1.1 404 Not Found';
$SCRIPT['html_title']='Страница не найдена';
$SCRIPT['html_content']='<p>Страница с таким адресом на сайте не существует, возможно она была перенесена или вы перешли по некорректной ссылке. Попробуйте воспользоваться <a href="'.$CONFIG['site_url'].'main/sitemap/">картой сайта</a>, чтобы найти нужную страницу.</p>';
$SCRIPT['html_content']='<p>У вас нет прав доступа для просмотра содержимого данной страницы. Если вы забрели сюда по ошибке, попробуйте воспользоваться <a href=""'.$CONFIG['site_url'].'main/sitemap/">картой сайта</a> или свяжитесь с администратором.</p>';
}
elseif($error==500)// ошибка в скрипте
{
$SCRIPT['http_headers'][]='HTTP/1.1 500 Internal Server Error';
$SCRIPT['html_title']='Ошибка на сервере';
$SCRIPT['html_content']='<p>Из-за ошибки на сервере невозможно отобразить страницу. В самое ближайшее время она будет исправлена.</p>';
}
$SCRIPT['html_template']='main.php';
ScriptEnd();
}
// завершение выполнения сценария
function ScriptEnd()
{
global$CONFIG,$SCRIPT,$USER;
$SCRIPT['http_headers'][]='X-Powered-By: MYSite Runner';// кем сделан сайт
Файл /common/html/templates/main.php – основной html-шаблон сайта, можно сделать также шаблоны для всплывающих окон window.php, шаблон сообщения message.php и т.д. В шаблоны подставляются переменные $SCRIPT['html_title'] , $SCRIPT['html_description'], $SCRIPT['html_keywords'], $SCRIPT['html_revisit'], $SCRIPT['html_robots'] , $SCRIPT['html_content'].
Если теперь все соберем вместе и кое-что допишем, получим функциональный сайт. Понятно, что в приведенном примере учтено далеко не все, имеет смысл также сделать авторизацию пользователей, более детально продумать меню сайта, создать нужные таблицы в базах данных и т.д. Чтобы вам было проще я поместил все приведенные файлы в архив.
Добавление комментария