База данных в файле
"Файл вместо базы данных", как использовать файл вместо базы данных! Вообще... вместо того, чтобы придумывать заново велосипед, то вы можете использовать готовые движки на файлах.
Это мой собственный велосипед - которым я пользуюсь уже 11 лет.
Я мало знаю, как работают другие базы данных и даже другие движки на файлах - мне это просто не нужно - я сторонник необходимых знаний!
Файл как база данных
- Файл вместо базы данных.
- Зачем база в файле!?
- Формат файла базы, запись/получение данных!?
- Что такое "$page_id"?
- Главная проблема файла, как базы данных.
- Живой пример: база данных в файле.
- Построчно(предыдущий вариант.)
- Скачать
-
Главная проблема файла, как базы данных.
Как у любой медали есть две стороны, так и у файла есть положительные и отрицательные стороны!
Когда-то, теперь уже не вспомню, что я задумался, что эта проблема с файлом базы раньше или позже меня настигнет...
И вот на момент написания(переписывания) статьи она уже наступила частично!
Главная проблема файла - это "ВЕС"!
Вес файла не может быть бесконечным!
В php есть ограничение на размер файла! Этот параметр можно изменить.
Но... она актуальна только для страниц - где он файл участвует, например :
Страница blog.html и аналогичных.
И для поиска, когда во время поиска используется база в файле.
Для страниц с контентом она никак не влияет!(естественно я рассказываю о своей структуре сайта на файлах).
Когда возникнет проблема с файлом базы?
Данная проблема возникает в двух случаях, при выводе всех страниц в одном месте при загрузке:
Страница списка - https://dwweb.ru/blog.html.
Страница поиска - https://dwweb.ru/?search=Файл+вместо+базы.
Пример файла базы в 15 МБ.
Я провел некоторые изыскания, поскольку я должен знать, что меня ждет впереди...
В примере файла базы заносился лишь "$page_id" - "идентификационный номер страницы".
Записаны в одну строку.
С разделителем :
* .Вы можете посмотреть на этот файл:
В нем подсчитаем сколько "$page_id" с помощью : echo, count, explode, file_get_contents.
echo count (explode('*', file_get_contents ( 'путь/example.dat') ) );Получим... количество "page_id"
500001 Вес файла:
Размер файла : 15.735626220703 мб
Пример обработки файла базы в 15 МБ/
С файлом в 15 МБ выше вы уже познакомились... теперь давайте:
Выведем все "ID" через цикл, чтобы посмотреть... как это будет...
Конечно... довольно странно выводить 500 000 в одном месте за 1 раз, но тем не менее:
<?
$t_arr = explode('*', file_get_contents ($home .'/__a-data/__all_for_scripts/__examples/php/file_base/example.dat'));
$new_echo = count ( $t_arr ) ;
if($_GET[example]=='1')
{
for ($i=0; $i < $new_echo ; $i++) {
echo $t_arr[$i]. '<br>';
}
exit;
}
?>
Смотрим - да загружается довольно долго,
но опять же повторюсь , что странно выводить все 500 000 страниц в одно месте... человек если осилит пролистать 10 строк, то ему уже нужно поставить памятник!Теперь давайте попробуем вывести 30 страниц, как вот на этой странице.
Файл базы будет загружаться полностью, но в цикле ограничим вывод в 30 строк...
for ($i=0; $i < 30 ; $i++) {Смотрим - здесь никакой проблемы вы не должны увидеть, поскольку её здесь нет
Почему данная проблема актуальная для меня частично?
Для всего списка - эта проблема ещё неизвестно когда возникнет. Посмотрите на странице... blog - нужно пуститься в самый низ - там есть скорость загрузки страницы... она будет колебаться в пределах 0.2 - 0.3 секунды, это отличный результат!
А вот с поиском... уже на момент написания статьи есть проблема... скорость поиска желает оставлять лучшего! Проверь сам.
Для справки состояние моего файла базы: Вес моей базы данных в реальном времени :
0.55599784851074 мб Количество страниц:
1575
Как решить проблему файла базы?
О выводе всех страниц в одном месте:
Итак... выше вы уже видели примерный вариант решения проблемы большого файла базы(в пример 15 МБ) - это вывод не всего файла (
напоминаю ! ), а лишь его части. Вы можете его скачать - чтобы проверить действительно ли он весит 15 МБ.Вообще... вы должны себя спросить... а уж так ли вам нужно выводить все страницы в одном месте?
Ну посмотреть... как ранжируются страницы по посещаемости... ещё для чего?
Короче... Для меня в данный момент - это не актуально, как только эта проблема станет актуальной... примусь её решать!
О странице поиска.
Решение этой проблемы займусь уже скоро... Могу только предположить:
Отправлять запрос одновременно и сразу 3 или более штуки с помощью javascript.
Каждый из запросов будет обрабатывать только часть массива...
Файл вместо базы данных.
"File or MySQL - Файл вместо базы данных.
На данной странице я даже ставить такой вопрос и выбор не буду - это вы сами должны разобраться и решить самостоятельно! Лишь скажу, что у всякой медали две стороны!
Давайте разберемся в понятиях!
Весь контент хранится в файле.
А так называемая "база" - это ассоциативный массив в отдельном файле.
Пример ячейки массива (на одну страницу) базы данных:
Выведем через print_r :
Array
(
[title] => База данных в файле
[text] => Текст для главной?
[data] => 11.12.2024
[img] => engine.png
[url] => baza_dannyih_v_fayle.html
[tags] => file_cms/
)
Где используется этот файл базы?
Использование этого массива вы можете посмотреть:
Все страницы : "https://dwweb.ru/blog.html". Эта же страница:
Списком: https://dwweb.ru/?spisok=blog.
Сортировать по возрастанию : https://dwweb.ru/?spisok=blog&sort=up.
Сортировать по убыванию: https://dwweb.ru/?spisok=blog&sort=down.
Страница "темы", всё что начинается с get "tema=" : https://dwweb.ru/?tema=php.
Также все типы сортировок, что перечислены выше для "blog.html".Страницы поиска : https://dwweb.ru/?search=Файл+вместо+базы.
Зачем база в файле!?
Естественно, что вы должны задать вопрос:
Если вы хотите прочитать сразу "ИТОГО" - см. здесь.
Несколько случаев... из реальной жизни:
В начале пути, мне потребовался "html editor", ну для примерно вот такой, для редактирования страниц, которые уже существуют у меня на сайте.
Мой собственный html editor попал кусочком вот здесь в видео.
Дело в том, что когда я скачал и установил подобный "html editor" -
В нем было:
Что они все там делали мне до сих пор непонятно!
Когда-то у меня был сайт на движке osclass - было настолько странное впечатление... и я задавал вопрос... нахрена так все сложно?
Складывалось такое ощущение, что собралось несколько программистов, которым была поставлена задача максимально сделать код непонятным!
Какие-то совершенно элементарные задачи решались так сложно, что я даже вспоминать не хочу!
Например создание "xml" карты... это был вообще какой-то треш!
Я даже с теми "нулевыми" знаниями понимал, что делается всё настолько просто... что не понимал нафига в движке такая порнуха...
Выше я привел два ярких отрицательных моих опыта и было ещё несколько, которые меня привели к идеи "
Поскольку с самого начала я использовал простые "html страницы" - они остались как идея хранения контента с некоторыми усовершенствованиями - здесь смысл такой:
А вот страницы списков надо было что-то придумать и вот родилась такая идея хранить пару строк о странице...дату, текст, теги в ассоциативном массиве в отдельном файле.
Формат файла базы, запись/получение данных!?
Какой формат выбрать для хранения базы в файле?
Не буду повторяться, здесь уже перечислены все типы, которые возможны для использования.
Я использую формат файла для базы:
Краткая информация о странице будет хранится в ассоциативном массиве? пример ячейки массива для данной страницы была выведена здесь.
Далее нам нужно разобраться... в двух процессах : сохранение и получения данных.
1). Как записать данные базы в файл?
Не буду подробно останавливаться на вопросе записи - потому, что это отдельная тема, только тезисно:
Если файл уже существует... его нужно получить в переменную( далее "$m_a" - $main_array ) file_get_contents.
Поскольку в файле "сериализованный массив", то его нужно вернуть в массив с помощью unserialize.
Создаем новую ячейку массива, например:
$page_id = '204f390a8ca6c2d5e00fd18f8c72863d';
$m_a[$page_id]['title'] = 'База данных в файле';
$m_a[$page_id]['text'] = 'Текст для главной?'; //необязательно - здесь можно дать некоторые подробности о странице - если нужно...
$m_a[$page_id]['data'] = date('d.m.Y');
$m_a[$page_id]['img'] = 'engine.png';
$m_a[$page_id]['url'] = 'baza_dannyih_v_fayle.html';
$m_a[$page_id]['tags'] = 'file_cms/';
Для записи ассоциативного массива, нужна строка, поэтому используем serialize.
Для записи в файл нам нужна функция file_put_contents.
Одновременно создаем страницу с контентом.
И записываем краткую информацию о странице в файл базы!
2). Как получить данные из базы в файле?
Для получения данных из файла базы данных нам нужна функция file_get_contents - мы получили строку...
Строку надо вернуть в массив с помощью : unserialize
Что такое "$page_id"
Выше вы встречали "$page_id" - что это такое?
$page_id или $id_page - как вам нравится - это уникальный идентификатор страницы подробнее здесь.
Откуда взять ссылку страницы, если она еще не создана?
Рассмотрим на примере данной страницы.
У вас должна существовать форма form для ввода данных.
Одно из полей input, например name = title :
<input type="text" name="title">
Получаем с помощью post всю ячейку смотри выше...:
Создание "$page_id"
Получили данные из поля ввода "title" выведем с помощью echo $_POST['title']; получим:
Функция транслита ru_to_en, echo ru_to_en($_POST['title']); смотрим:
Приводим к строчным буквам собственная функция my_strtolower - зачем собственная функция а не встроенная strtolower?:
baza_dannyih_v_fayle
Добавляем разрешение...(мне нравятся страницы по ОЛДскульному... чтобы было разрешение... ".html"):
baza_dannyih_v_fayle.html
Пропускаем через md5 ... ну вот и получили ваш "$page_id" :
Соберем весь код "$page_id":
if($_POST['title'])
{
$page_id =
md5(
my_strtolower (
ru_to_en($_POST['title']) ) ) .html) ;
Живой пример: база данных в файле.
Всю теорию, которую изложил выше, вы можете скачать в готовом виде! Скачиваем архив здесь.Как работает пример записи в базу данных в файле?
Закидываем в любую папку на сайте.
Открываем файл "do_base.php" в браузере... вы должны увидеть форму, в данном примере - только две формы... скрипт сделан для понимания процесса... вы можете добавить сколь угодно полей...:
После заполнения формы и нажатии кнопки отправить... вы получите результат в виде сообщения и первой ячейки массива базы в файле...
Построчно(предыдущий вариант.)
В связи с неактуальностью информации, которая была здесь, чтобы не загаживать страницу еще больше... инфа была удалена!
Здесь было несколько пунктов об использовании построчной записи/хранения данных через разделитель, только через некоторое время я узнал, что такой способ хранения используют в файлах csv.
В связи с тем, что построчная запись неудобна в прямом и переносном смысле... с 2018 года основная база была переведена на ассоциативный массив.
Всё просто... предположим, что вам в построчно записанную информацию требуется ввести какой-то новый параметр...
В файле "csv" вам потребуется создавать новый столбец для этого параметра, но этот параметр больше нигде не нужен, и если вам потребуется новый параметр в следующий строке, то вам опять нужен новый столбец, но уже созданный в первой строке столбец нельзя использовать, поскольку он другой...
Поэтому, так делать нельзя(о предыдущем абзаце), вам придется вводить эти данные в какую-то уже существующую ячейку... и соответствующим образом потом её от туда доставать...
Постепенно, ваш файл "csv" превращается в огромную кучу писанины, в которой ты ничего не можешь понять!
В ассоциативном массиве:
Делаем так:
Свои комменты в ожидании переделки!
Когда сделаю не знаю!
Времени нет...
Иначе сообщение будет удалено, вас в бан - все просто!
Но если, сил нет как хочется высказать всё, что вы думаете об этом, пожалуйста - комменты от Vk - форма ниже: