Краеугольный камень для всех начинающих программистов PHP — организация сайта без использования базы данных. О целесообразности писать не буду. Есть довольно много работающих систем, некоторые очень даже привлекательны. Считается, что проблема «PHP и файлы» давно решена в пользу PHP+MySQL = стандарт. Но эта проблема застыла в вечности, и все равно к этому вопросу обращаются новые адепты и возвращаются те, у кого есть уже опыт программирования на PHP.
Однако, написать эту заметку меня натолкнула просьба двухлетней давности одного знакомого, которому понадобилось на сайте выводить новости без использования БД. Мало того, человеку не нужна была даже панель администрирования, так как сайт располагался на его домашнем компьютере. Я не мог заставить отказаться от убежденности его в том, что не может быть ничего проще открыть блокнот, записать туда нужный текст и отправить в нужную папку.
Я не помню, как мы решили вопрос с сайтом. Но сейчас эта идея всплыла в моей голове. Даже интересно посчитать и сравнить количество операций при добавлении новости на сайт через админку и через блокнот, с учетом того, что сервер на рабочем компьютере.
Шутки ради — честно ищем кратчайший список операций для каждого.
Классический способ
1. Открыть браузер.
2. Набрать адрес или нажать на вкладку.
3. Опционально. набрать пароль или нажать подтвердить.
4. Набрать текст.
6. Нажать отправить.
Получаем 5-6 операций. Затраты времени на открытие браузера.
Способ с файлами
1. Открыть блокнот.
2. Набрать текст
3. Сохранить сразу в папку на сервере.
А ведь в этом что-то есть!
3 операции, может, 4. Нет затрат времени на открытие браузера, блокнот в Windows открывает мгновенно.
Про Linux/BSD писать не будем, редактор vi не для контент-менеджера, хотя, если сервер не на рабочем компьютере, то все равно может оказаться быстрее — открыть ssh, создать файл с помощью vim или nano. Тем более, что в vim сохранение и закрытие файла прекрасно сводятся к одной команде.
Теперь немного практики. Следующий скрипт сыроват. Это лишь начало попытки реализовать идею новостей на файлах. Задача написать максимально простой и понятный код.
1. Создадим папку в директории www для хранения файлов, у меня bd/.
Поместим туда файлы с данными. Условимся, что имена файлов в этой папке должны содержать только цифры.
2. Теперь напишем такой скрипт:
- В первой части мы сканируем папку и получаем все имена файлов (функция scandir);
- Переворачиваем массив (array_reverse) и запускаем цикл по массиву;
- С помощью preg_match отсеем случайные файлы и метки ссылки на текущую и директорию выше (./ ../), которые тоже попадут в массив.
Дальше условие: если регулярное выражение срабатывает и ключ в массиве равен номеру страницы, то получаем данные из этого файла и выводим. Первым будет выводится последний созданный нами файл (мы перевернули массив ранее — array_reverse).
<?php
$dir = 'bd/';
$files1 = scandir($dir);
$files1=array_reverse($files1);
foreach ($files1 as $key => $val) {
$a=preg_match('/d+.txt/', $val);
if ($a==true && $key==$p) {
$val=$dir.$val;
$news=file_get_contents($val);
?>
<?=$news?>
Однако вывода мало, нужно как-то листать новости.
Тогда посчитаем все ключи в массиве (функция count) и напишем условие: если установлена переменная p — номер страницы — и она равна количеству всех записей в массиве — 2 (помним, что в массиве по крайней мере два ненужных нам ключа), тогда выводим надпись, что больше ничего нет. Устанавливаем переменную в -1, конечно, — этом не очень красиво, но так мы зацикливаем переход по страницам.
<?php
}
}
$all=count($files1);
if (isset($p) && $p == $all-2) {
echo "Nothing ";
$p=-1;
}
?>
<a href="index.php">First</a> ||
<a href="index.php?p=<?=++$p?>">Next</a>
Можно убирать расширение .txt у файлов с новостями вообще, тогда массив будет выглядеть вот так:
Array ( [0] => 7 [1] => 6 [2] => 5 [3] => 4 [4] => 3 [5] => 2 [6] => 1 [7] => .. [8] => . )
Что несколько его уменьшает и упрощает, и однозначно должно сказываться на производительности.
В итоге
Если отойти от первоначальной идеи добавления новостей через блокнот и сделать панель администрирования с html-шаблоном для текста, то можно хранить данные в файлах с расширением .html, которые будут содержать все нужные мета-теги, title для каждой страницы и т.д. — что должно быть полезно для поисковиков.
Функциональный недостаток — постоянные адреса страниц будут с цифрами. Но есть и плюс — можно попытаться организовать полнотекстовый поиск по файлам, в качестве ссылки на страницу с найденным будет имя файла.
Если сервер на Linux, можно попробовать использовать встроенные средства для поиска.
Автор: dcc0