По многочисленным просьбам посетителей и друзей, я решился приоткрыть карты и немного рассказать о движке моего сайта.
Статья рассчитана на людей, хоть чуть-чуть знающих PHP, поэтому я не буду зря стучать по клаве для разъяснения «что такое движок для сайта» или преподавания «основ PHP».
Цель
В этой статье я хочу показать на примерах и объяснить, как сделать полноценный движок для сайта, используя только технологию PHP и обычные текстовые файлы.
Принцип такой: весь контент сайта хранится в файлах, содержащих только текст и структурную разметку, все остальное оформление будет генерироваться скриптом.
Приступим к созданию
Создаем стандартный PHP-файл с таким содержанием (далее все, что выделено в рамочки, является рабочим PHP-кодом):
<?php
# Argon PHP-SiteEngine 0.5
# Copyright 2003-2004 Argon
# http://argon.com.ru/
Для совместимости с большинством конфигураций PHP, вставляем следующую строку:
extract($HTTP_GET_VARS);
PHP в безопасной конфигурации хранит все данные, переданные скрипту методом GET (то есть в адресной сроке), в специальном массиве $HTTP_GET_VARS. Эта команда извлекает ключи и соответствующие им значения из этого массива в обычные переменные.
С этого момента, если строка запроса к скрипту выглядит так:
http://argon.com.ru/engine.php?p=/windows/winxp/
то нашему скрипту движка становится доступна переменная «$p» со значением «/windows/winxp/».
$cntext='.txt';
$cntdir='cnt';
Здесь мы задаем в переменной «$cntext», какое расширение будут иметь файлы, содержащие текстовое наполнение сайта. А в переменной «$cntdir» — директорию на сервере, в которой будут храниться все эти файлы.
Договоримся, что в переменной «$p» мы будем передавать скрипту относительный путь к текстовому файлу, который будем вставлять в скелет страницы.
Если к скрипту нашего движка обратиться без параметра «$p», то мы будем выводить главную страницу сайта:
if(!$p)$p='/';
Считается хорошим тоном, если адрес главной страницы какого-нибудь раздела на сайте представлен как путь к директории. Но ведь мы не можем вставлять в каркас страницы директорию… Поэтому, если относительный путь заканчивается слешем («/»), то мы этот слеш заменяем на «/index»:
$p=ereg_replace('/$','/index',$p);
Теперь нам нужно преобразовать относительный путь к файлу-вставке в путь физический, который можно будет использовать при обращении к файлу:
$l=$cntdir.$p.$cntext;
Поясню на примере два предыдущих абзаца. При запросе
http://argon.com.ru/engine.php?p=/windows/winxp/
переменная «$p» (относительный путь) будет иметь значение «/windows/winxp/», а переменная «$l» — значение «cnt/windows/winxp/index.txt».
Делаем уникальные заголовки страниц
Нам нужно, чтобы у каждой страницы был уникальный заголовок. Для этого, в первую строку каждого файла с текстовой информацией помещаем тег комментария HTML, после которого должен обязательно стоять перенос сроки. В этот тег помещаем название страницы.
Пример: <!-- Заголовок страницы -->
А следующая команда будет выдирать из файлов с контентом названия страниц в переменную «$title»:
$file=fopen($l,'r');$title=substr(substr(fgets($file,512),5),0,-6);fclose($file);
Теперь все готово для генерирования конечного документа.
Генерируем конечный документ
echo('<html><head><title>');
Тут, надеюсь, все понятно.
Теперь вставляем сам заголовок:
echo($title);
Если нужно, то к этому заголовку можно приписать и название сайта, вот так:
echo(' / Название сайта</title>');
Здесь можно вписать все необходимые теги в секцию «head»:
echo('<meta name="keywords" content="argon, hardware, software, windows, internet, humor, other">
<link rel="stylesheet" type="text/css" href="default.css">');
А дальше просто вставляем дизайн страницы:
echo('</head><body>[дизайн шапки]');
Если необходимо в каком-нибудь месте вывести заголовок страницы, то смело используем переменную «$title»:
echo('[дизайн заголовка1]'.$title.'[дизайн заголовка2]');
Вставляем код, который нужно добавить до вставки основного контента:
echo('[дизайн контента1]');
И самый ответственный момент — вставляем сам контент:
include($l);
Дальше все просто: заканчиваем страницу:
echo('[дизайн контента2][дизайн подвала]</body></html>');
?>
Готово
Осталось только проставлять в ссылках относительный путь к нужному включению, например, так:
/index.php?p=/internet/webmastering/phpoptim
Для большей наглядности, весь приведенный выше код был в крайне неоптимизированном виде, что хорошо для понимания, а для сервера — лишняя нагрузка.
Теперь приведем скрипт в более легкий для сервера вид, руководствуясь советами статьи «Оптимизация PHP-скриптов».
<?php
# Argon PHP-SiteEngine 0.5
# Copyright 2003-2004 Argon
# http://argon.com.ru/
extract($HTTP_GET_VARS);
$cntext='.txt';
$cntdir='cnt';
if(!$p)$p='/';
$l=$cntdir.ereg_replace('/$','/index',$p).$cntext;
$file=fopen($l,'r');$title=substr(substr(fgets($file,512),5),0,-6);fclose($file);
echo('<html><head><title>' . $title . ' / Название сайта</title><meta name="keywords" content="argon, hardware, software, windows, internet, humor, other"><link rel="stylesheet" type="text/css" href="default.css"></head><body>[дизайн шапки][дизайн заголовка1]'.$title.'[дизайн заголовка2][дизайн контента1]');
include($l);
echo('[дизайн контента2][дизайн подвала]</body></html>');
?>
Как работает этот скрипт «вживую» и пример организации контентных файлов можно посмотреть здесь.
Все только начинается…
Просто? Просто! Такой же движок можно реализовать и на SSI, и даже на JavaScript… Но я привел лишь основы. Я не стал бы писать эту статью, если бы этот движок не был универсален и масштабируем. К нему можно прикрутить фичи практически любой сложности, например:
- свой дизайн для каждого раздела сайта или типа страниц (статья, список статей, главная)
- вставка своего описания и ключевых слов для каждого документа
- дополнительные динамические вставки (например, случайный анекдот)
- вывод определенных служебных страниц (например, в случае ошибки)
- автоматическая переадресация
- отсутствие знака «?» в строке адреса (используя технологию mod_rewrite)
- подсчет времени генерации страницы
Реальную работу всего вышеперечисленного можно увидеть, побродив по сайту, на котором вы читаете статью…
Если у вас возникли вопросы или предложения, обращайтесь на .
Неглохнущего вам движка!