По многочисленным просьбам посетителей и друзей, я
решился приоткрыть карты и немного рассказать о движке моего
сайта.
Статья рассчитана на людей, хоть чуть-чуть
знающих 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)
- подсчет времени генерации страницы
Реальную работу всего вышеперечисленного можно увидеть,
побродив по сайту, на котором вы читаете статью...
Если у вас возникли вопросы или предложения, обращайтесь на
.
Неглохнущего вам движка!
|