Краеугольный камень для всех начинающих программистов 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. Создадим в bd файл с именем, допустим, all.dat — в нем будем вести счёт новостям. Наличие этого файла избавляет от использования функций scandir или glob для подсчёта файлов. Запишем в него цифру 0.
Панель администрирования
Создадим папку ad в директории www и поместим туда следующий скрипт. У меня index.php. С учётом того, что данная директория будет под паролем и доступна только одному администратору, то тут можно пренебречь некоторыми принципами хорошего кода.
Форма ввода новостей.
<div align="center">
<form action="index.php" method="post">
<p>New</p>
<br/>
<textarea name="text1" cols="80" rows="25"></textarea>
<p><input name="ok" type="submit" value="send" "/>
<input type="reset" value=reset /></p>
</form>
</div>
Все просто. Обрабатываем форму. Я делаю минимум условий. Если текстовое поле не пусто, то получаем запись из файла, в котором ведем счет записям — all.dat. А в нем у нас 0.
Создаем файл с именем 0.txt, проверяем на всякий случай его наличие и записываем в него данные.
<?php
$text1 = $_POST['text1'];
if (isset($_POST['ok']) && (!empty($text1)))
{
$all = file_get_contents('../bd/all.dat');
$file = '../bd/' . $all . '.txt';
if (!file_exists($file))
{
$fp = fopen($file, "w");
fclose($fp);
$fp = fopen($file, "r+");
fwrite($fp, $text1);
}
}
?>
Теперь проверим, существование нового файла и увеличим счётчик на 1 в файле all.dat.
<?php
$new = '../bd/' . $all . '.txt';
if (file_exists($new))
{
$all+= 1;
$fp = fopen('../bd/all.dat', "r+");
fwrite($fp, $all);
fclose($fp);
}
?>
Для вывода новостей на главную страницу напишем такой скрипт. Получим число записей из all.dat.
Дальше совсем просто, если переменная для страницы — p — установлена и такой файл есть, получаем содержимое.
Иначе получаем последнюю сделанную запись.
<?php
$p = $_GET['p'];
$allcount = file_get_contents('bd/all.dat');
$entry = "bd/{$p}.txt";
if (isset($p) && file_exists($entry))
{
$news = file_get_contents($entry);
}
else
{
$p = $allcount - 1;
$entry = "bd/{$p}.txt";
$news = file_get_contents($entry);
}
?>
<div class="bform"><div class="headlines"><?=$news?></div></div>
<div class="footer ">
<a href="index.php">First</a> |
<a href="index.php?p=<?=--$p?>">Next</a> </div>
Обратите внимание, что записи перевернуты, то есть файл с большим числом в имени и есть последняя новость на главной, а для перемотки использован декремент.
Вывод: получилось избавиться от массивов, циклов и функций glob, scandir.
К скрипту так же просто можно добавить удаление и редактирование в панели администратора. Останется только организовать защиту и можно потестировать скрипт на бесплатном хостинге.
Файлы можно хранить не в .txt а .html, что позволит прописывать для каждого файла, например, свои мета-теги.
Несложно будет добавить эту опцию в панель администратора.
Post Scriptum:
Целью этой заметки является привлечение внимания к перегруженности профессиональных решений для организаций новостей и поиска вдохновения для написания микродвижков.
Фикции
В слайдер можно можно добавить опцию для настройки паузы. Если вычислять пазу с помощью скрипта и устанавливать значение времени с учетом количества символов (и учесть вдобавок среднюю скорость чтения взрослого человека ), то вполне может получиться полностью автоматическая система для скорочтения.
Останется добавить только голосовое распознавание текста и от экрана можно отойти.