Php база данных как файл

Обновлено: 06.07.2024

Любой крупный проект требуется длительного хранения информации. Частично можно решить данную проблему с помощью данных Cookie. Однако данное решение имеет ряд недостатков, поэтому информацию следует хранить в более безопасном месте с ограниченным доступом, например на сервере.

Сохраняться информация может в текстовых файлах или в базе данных. Текстовые файлы хранятся в локальной файловой системе. Их можно прочитать с помощью команд операционной системы и редактировать любым доступным способом. Информация в файлах обычно хранится в строковой форме.

Для использовании баз данных требуется установить специализированное программное обеспечение, например MySQL. Базы данных тоже представляют собой файлы, которые, однако, создаются соответствующими приложениями и могут быть доступны только через них.

При использовании баз данных необходимо иметь навыки работы с соответствующим программным обеспечением. Например, для получения нужной информации достаточно правильно сформулировать запрос на языке SQL, чтобы система управления базами данных обработала этот запрос и предоставила результат. При этом абсолютно не важно, где и в каком виде хранится требуемая информация.

Приведем преимущества использования текстовых файлов по сравнению с базами данных. I

- Простота и гибкость. Нам не нужно устанавливать дополнительное программное обеспечение для работы с базами данных. Достаточно создать файл средствами РНР и хранить в нем полезную информацию. Кроме того, текстовые файлы можно обрабатывать во многих текстовых редакторах или электронных таблицах.

- Экономия дискового пространства. Текстовые файлы занимают гораздо меньше дискового пространства, чем базы данных.

Текстовые файлы являются простым и эффективным с точки зрения использования ресурсов способом хранения небольших объемов информации. Они просты в использовании и обеспечивают быстрый доступ к данным. Текстовые файлы доступны для всех, кто обладает правами на доступ к требуемому каталогу, поэтому их можно использовать в качестве средства обмена информацией.

Базы данных, кроме обеспечения безопасности на уровне операционной системы, предоставляют дополнительный уровень защиты. Также база данных обладает поддержкой сложной структуры данных, различными типами данных и взаимосвязями. Это позволяет существенно упростить поиск и извлечение требуемой информации.

Еще одним преимуществом использования баз данных является поддержка многопользовательского режима, который обеспечивает согласованность данных и предотвращает опасность их затирания или потери. Все это достигается значительно большим используемым дисковым пространством.

Существует также и встроенная база данных SQLite, которая устанавливается вместе с интерпретатором PHP и предназначена для использования файлов и баз данных. При использовании расширения SQLite информация хранится в текстовых файлах, однако для доступа к ним применяется стандартный язык запросов SQL. Расширение SQLite удобно использовать для хранения и обработки небольших объемов данных, однако для организации большого хранилища данных все же лучше воспользоваться специализированными пакетами.

Использование текстовых файлов

При их использовании текстовых файлов не нужно устанавливать дополнительное программное обеспечение. Для чтения или записи в файл достаточно воспользоваться соответствующими операторами языка РНР.

Обработка тестовых файлов происходит в 3 этапа:

1. Открытие файла.

2. Запись или извлечение данных из файла.

3. Закрытие файла.

Для выполнения операций над файлом его необходимо открыть. Для этого предназначена функция Fopen, общий синтаксис которой:
Переменная $fh является дескриптором файла (file handle), который используется при чтении или записи данных в файл. Дескриптор файла содержит информацию о местоположении открытого файла.

Для определения действий, которые будут выполнятся над файлом после его открытия, необходимо указать соответствующий режим. Опишем основные режимы:

'w' - Только запись. Создается новый файл. Если файл существует, новый файл полностью перезаписывает содержимое.

'w+' - Чтение и запись. Создается новый файл. Если файл существует, новый файл полностью перезаписывает содержимое.

'a' - Добавление данных в конец файла. Если файл не существует, создается новый файл.

'a+' - Чтение и добавление данных в конец файла. Если файл не существует, создается новый файл.

Открытие файла в режиме чтения

Открытие файла на другом Web-узле

Если файл размещен на другом Web-узле, его можно открывать только в режиме для чтения:
Закрытие файла

После использования файла его обязательно нужно закрыть функцией Fclose:
В качестве входного параметра функция использует дескриптор файла $fh, который ранее был создан при его открытии.

Запись в файл

Для записи в файл различной информации предназначена функция Fwrite со следующим общим синтаксисом:
Параметрами этой функции являются дескриптор файла $fh, созданный при его открытии, и данные, которые необходимо сохранить. В качестве данных можно использовать текстовую строку или переменную. Например:
В этом фрагменте файл открывается для добавления информации. Если при открытии файла не существовало, будет создан новый файл. При этом данные будут записаны в его первую строку. При открытии существующего файла текущая информация добавляется в конец файла.

Гораздо удобнее размещать различную информацию в отдельных строках. Для этого функцию Fwrite нужно вызвать таким образом:
Если в файл нужно добавить информацию, его необходимо открыть в режиме 'а'. При открытии в режиме записи файл каждый раз будет создаваться заново, а информация - перезаписываться.

Чтение файла

Для чтения файла предназначена функция Fgets со следующим синтаксисом:
где $fh - дескриптор файла, который был создан при его открытии. Функция Fgets считывает файл до тех пор, пока не будет достигнут конец строки или файла. В указанном примере информация сохраняется в переменной $line. Построчно можно прочитать весь файл. Для определения конца файла в языке РНР предназначена функция Feof. В сле­дующем примере считываются и выводятся все строки файла:
Функция Feof возвращает значение TRUE при достижении конца файла с дескриптором $fh. Восклицательный знак в условном выражении цикла While обеспечивает чтение всех строк файла.

Символ перевода строки используется функцией Fgets по умолчанию. В некоторых случаях этого не требуется, так что эти символы нужно удалить:
Функция Rtrim удаляет пробелы в конце строки и символы перевода строки. Так что при ее использовании будет получен следующий результат в одну строку.

Чтение файлов по частям

Для считывания строки определенного размера следует использовать функцией Fgets со следующим синтаксисом:
В данном случае строка длиной n-1 будет считываться до тех пор, пока не будет достигнут конец строки или файла. Например:
В приведенном фрагменте считываются каждые десять символов, пока не будет достигнут конец файла. Обратите внимание, что после каждой строки по умолчанию используется символ перевода строки.

Размещение файла в массиве

Разместить содержимое всего файла в массиве можно следующим образом:
В результате будет создан массив $content, ключами которого будут целые числа, а значениями - строки, считанные из файла.

То же самое можно осуществить с помощью одной функции File. При этом получится аналогичный результат:
Функция File открывает файл, размещает строки в массиве $content и закрывает файл. Следует следить за объемом использованной памяти, поскольку, если открываемый файл очень большой, то использование функций File может существенно замедлить работу сценария. Для ускорения быстродействия, где это возможно, вместо функции File следует пользоваться функцией Fgets.

Размещение файла в строке

Содержимое файла можно разместить в одной длинной строке. Для этого предназначена функция File_get_contents:
Функция File_get_contents полностью аналогична File, за исключением того, что содержимое файла размещается не в массиве, а в строке. Символы перевода строки входят в состав результирующей строки $content и, естественно, учитываются при выводе.

Обмен данными с другими программами

Благодаря использованию файлов, можно обеспечить взаимодействие сценариев РНР с другими приложениями. Практически все без исключения программы предоставляют возможность считывания или записи данных в файл и последующим взаимодействием с другими приложениями.

Для работы с файлами необходимо точно знать формат сохранения информации. В сценарии РНР такой формат можно сгенерировать с помощью функции Fwrite.

Файлы CSV (Comma-Separated Values - значения, разделяемые запятой), иногда называемые также файлами с символами-разделителями, (comma-delimited file), являются стандартным средством обмена данными между различными приложениями. Файлы CSV могут использоваться для обмена информацией, содержащейся в таблице (со столбцами и строками) и используется текстовыми редакторами, например OpenOffice Calc. Формат CSV достаточно распространен и поддерживается различным программными обеспечением.

CSV-файл имеет следующую структуру: каждая его строка соответствует строке таблицы, а значения, разделенные запятой, - столбцам. Рассмотрим следующий пример легковых автомобилей, организованной с использованием файла CSV:
OpenOffice Calc позволяет прочитать этот файл и преобразовать его в таблицу, состоящую из трех столбцов. При этом запятая используется в качестве символа-разделителя.

Следующий фрагмент кода на языке РНР позволяет создать файл в формате CSV.
Для чтения CSV-файла можно воспользоваться функцией File или Fgets. Однако специально для этих целей в языке РНР имеется функция Fgetcsv, которая при чтении файла каждую строку записывает в массив, элементами которого являются значения столбцов. Например:
В приведенной строке из файла с идентификатором $fh считывается строка длиной
1000 символов. Результатом выполнения функции Fgetcsv будет следующий массив:
Формат CSV очень удобно использовать при передаче данных между различными приложениями. Однако не забывайте о том, что если символ ',' является частью данных, то его нельзя использовать в качестве символа-разделителя.

В данном посте я хочу рассказать об использовании json файлов как базы данных. Использование именно формата json удобно тем, что информация в данном формате — это Javascript массивы и объекты, к которым легко можно получить доступ с клиентской части web приложения.
Любая база данных включает в себя набор функций для записи, чтения, обновления и удаления данных из таблиц. В данном случае это будет класс с набором методов для управления базой.

  • $path — путь от корня до папки, в которой будут храниться файлы. По умолчанию $path = $_SERVER[«DOCUMENT_ROOT»].'/jdb/'.

Управление базой данных

Ниже представлен набор методов и примеров их использования.

Create
Создание таблицы.

  • $keys — массив ключей таблицы и их характеристик. Поддерживается auto_increment и default.

Select
Выборка данных из таблицы.

  • $select — массив или строка, содержащие ключи для выборки.
  • $table — название таблицы из которой будет происходить выборка данных.
  • $rules — массив, содержащий параметры where, order и limit.

Insert
Вставка данных в таблицу.

  • $data — ассоциативный массив данных для вставки в таблицу.

Update
Обновление данных в таблице.

  • $table — название таблицы.
  • $data — ассоциативный массив с данными для обновления.
  • $where — ассоциативный массив с данными для выбора нужной записи для обновления.

Delete
Удаление записей из таблицы.

  • $table — название таблицы.
  • $where — ассоциативный массив данных для выборки нужной записи для удаления.

Drop
Удаление таблицы.

Alter
Добавление и удаление ключей из таблицы.

  • $table — название таблицы.
  • $todo — выполняемое действие. Может быть add или drop.
  • $keys — строка или ассоциативный массив данных для удаления или добавления ключей.

Truncate
Полностью очистить таблицу.

Определение ошибок в запросах

Все перечисленные методы возвращают результат запроса, если он был удачен, и false если нет. Метод "status" позволяет узнать статус предыдущего запроса.

  • 0 — All ok.
  • 101 — Table already exists.
  • 102 — Table doent exist.
  • 103 — Unkonw property.
  • 201 — Key already exist.
  • 202 — Keys doesnt exsit.

Вспомогательные методы

Last_insert_id
Часто бывает, что нужно узнать id добавленной записи в базу данных. Для этого нужно воспользоваться методом last_insert_id.

Exist
Проверяет существование таблицы. Возвращает true или false;
Пример:

Так же для удобства есть возможность использовать sql синтаксис для выполнения запросов. Для этого используется другой класс.

  • $path — путь от корня до папки, в которой хранятся файлы. По умолчанию $path = $_SERVER[«DOCUMENT_ROOT»].'/jdb/'.

Так как в php есть возможность создавать функции и классы с одним именем, то можно применить следующую конструкцию:

Дополнительные запросы

Узнать статус запроса:

Узнать id добавленной записи в базу данных:

Узнать существует таблица или нет:

Сравнение Jsondb с MySql

Конечно, тут и сравнивать то нечего, базы данных для того и созданы, чтобы хранить данные и быстро получать к ним доступ. Но все же интересно.
Для сравнивания быстродействия и количества используемой памяти, был выполнен ряд тестов для методов insert, update и select.

Вообще, что такое база данных!? Это, по сути, те же файлы. Ведь физически они где-то храниться должны.

А кроме файлов, физической оболочки просто не существует! Как бы странно это ни звучало!

Только отличие файла от базы данных в способе обработки !
Кроме того!

Существуют базы данных, которые и позиционируются, что не требуют отдельного сервера, например → SQLite

По сути, это таже база данных, но только в файле, который может лежать в любой папке вашего сайта.

Я не против и не за базы данных!

Поскольку я не пользуюсь базами данными выше перечисленными, то и о преимуществах и недостатках ничего вам не могу сказать!

Но зато! Я 5 лет пользуюсь файлом в качестве базы данных. Одна строка - одна статья (формат файла ".dat").

Скоро - может даже сегодня, напишу(давно надо было сделать это), как можно хранить данные вашего сайта даже и без SQLite - это вообще самый, самый, самый простой способ! И если бы данный способ, как-то меня не устраивал, то я давно бы искал бы альтернативу!

Единственное -может, если ход дойдет, то для будущих статей буду изучать "SQLite"(но это не точно!) .

Почему я выбрал файл вместо базы данных!?

Базы данных придумали не просто так! И для большого проекта - скорее всего нужно использовать базу данных вместо файла.

Но когда вы собираетесь делать авторский сайт, блог, то база данных - это просто. ну не знаю.

Вам нужно перевести 10 кг груза и вы нанимаете Белаз грузоподъемность 120.000кг

Авторский сайт на файлах или на базе данных?

Мне не нравятся люди, которые нахватались верхушек и пытаются выдать себя за "гуру"! Я не ГУРУ, но я занимаюсь своим сайтом, который полностью построен на файлах и немного понимаю в файлах. Никаких предпосылок, что я собираюсь задумываться над переходом на базу данных с файлов.

Просто. частенько вижу в интернете категорические высказывания типа: "Сайт на файлах отстой и т.д. и т.п." - важно не на чём ваш сайт построен! А какой контент ! Это самое главное, что вам следует запомнить!

И это именно то, что вы сейчас видите вокруг и давайте попробуем разобраться. "Авторский сайт на файлах" или на базе данных!?

Предположим , что вы хотите сделать свой собственный авторский сайт(это моя история).

Естественно -самое простое - хранение данных в файле!

Давайте попробуем посчитать на пальцах емкость файла - ведь нам нужно знать, сколько статей вы сможете написать , прежде, чем файл станет неподъемным!

Будут существовать два вида файлов:

Естественно - в файле базы данных, сами статьи не будут хранится, а лишь краткая информация о странице(формат хранения, либо построчно, либо в ассоциативном массиве), чтобы вывести например их в виде списка.

А контент будет храниться в отдельных файлах - одна статья - один файл.

Сколько строк максимально для такого файла?

Специально провел эксперимент лет несколько назад. на сервере установлен максимальный размер файла, сейчас точно не помню, по моему 13мб - это можно узнать(не проблема.)

И только после 500.000 строк максимальный разрешенный объем файла был пройден!

Сколько статей в день!?

Предположим, что вы зададите себе план - 1 статья в день!

Поверьте мне на слово - что это не так просто сделать, как кажется! Насколько я упертый, даже я не смог этого сделать, за все время существования данного проекта, всего дней : - 2185 дней .
И если мы разделим количество статей, на данный момент 916 , на выше приведенное количество дней, то получим:
4 статьи в 10 дней. (0.41922196796339)
P.S. если интересно смотри счетчик сколько статей в день php

Вы сможете поддерживать ритм 1 статья в день на протяжении множества лет, то чтобы превысить барьер в 500.000 строк, вам понадобится

500.000 / 365 = 1369лет

Вы сможете писать 10 статей! Здесь, я как доктор говорю, что это! невозможно для 1 человека.

Но, даже, если это чудо произойдет, то вам все равно понадобится:

500.000 / 3650 = 137лет

Зачем это я вам все рассказываю!? К тому, что файл вполне подходит для создания личного сайта.

Основные параметры базы данных в файле.

Чтобы не разводить теорию, сразу притупим к основным параметрам и (скоро будет отдельная тема(надеюсь) движок на файлах.)

Всего будет два файла:

1). Где будем хранить данные о странице?

Файл базы данных(формат файла ".dat"), где будет краткая информация о странице.

Формат хранения ассоциативный массив. Первая версия была построчно

Сейчас - думаю нет необходимости останавливаться на этом подробно.

2). Где будем хранить контент?

Формат файла - здесь есть варианты. Сейчас использую ".html", но в будущем движке хочу также перейти на ".dat", но выводиться будет в адресной строке ".html" - это возможно когда у вас единая точка входа

Формат хранения контента в файле - сейчас в переменных(в этом способе есть свои плюсы и минусы!), но в движке будем хранить в массиве. В чем разница?

Это мы накидали только часть того, что касается базы данных + бонус немного о страницах.

Если мы начнем говорить о движке, то это не просто много, а очень много тем. Поэтому, будет отдельная страница!

Файл + ассоциативный массив.

Вид такого массива будет, если мы его выведем через print_r :

[title] => База данных или файл данных

[description] => Хранение данных база или файл?

В чем удобства именно такого хранения данных.

Мы спокойно можем добавить любой элемент в ячейку.

Удаление ячейки происходит до банальности скучно.

В общем больше не буду перечислять, как можно взаимодействовать с ассоциативным массивом..

Создаем уникальный "ИД"

Вы соберетесь изменить адрес данной страницы, то ваш "ИД" в ассоциативном массиве автоматически поломается!

Как решить такую проблему. Т.е. если ваша страница изменила адрес, то значит её по старому адресу нет. У меня это процесс происходит таким образом.

Копируем содержание страницы.

Удаляем страницу + автоматически удаляется ячейка в массиве.

Создаем новую страницу(вставляем скопированный контент) с новой записью в массиве.

Как и что, будем хранить данные в файле .dat

После того, как мы получили уникальный "ИД" - $page_id, который и будет главной ячейкой для страницы:

Если вы обратите внимание на ниже идущую первую строчку, то вы должны спросить - зачем там условие!

Это для того, если массив еще не существует, т.е. не создана еще ни одна страница, то создаем пустой массив.

Ну а если массив существует, то php вовнутрь по этому условию не зайдет.

Без данного условия, при каждой отправке данных на запись, массив создавался пустой, с единственной записью. И так каждый раз.

Процесс создания структуры массива с данными:

Если вы обратите внимание на ниже идущую первую строчку, то вы должны спросить - зачем там условие! Это для того, если массив еще не существует, т.е. не создана еще ни одна страница, то создаем пустой массив. Ну а если массив существует, то php вовнутрь по этому условию не зайдет. Без данного условия, при каждой отправке данных на запись, массив создавался пустой, с единственной записью. И так каждый раз.

Записываем название массива, это переменная :

Вторым элементов с троке идет уникальный ид ячейки - это переменная(т.е. таким образом переменной можно присвоить любое значение.) :

И третьим идет ключ внутри ячейки:, он может использоваться без кавычек в тмо случае, если в ключе нет пробела.

$example_main_array[$page_id][title] = 'База данных или файл данных';

$example_main_array[$page_id][description] = 'Хранение данных база или файл?';

$example_main_array[$page_id][author] = 'Марат';// Если это будет авторский блог , то данная ячейка не нужна!

Вывод ячейки массива на экран с помощью print_r

Выведем первую ячейку, которая у нас получилась:

[title] => База данных или файл данных

[description] => Хранение данных база или файл?

Как будем записывать и получать данные из файла

В данном пункте, хочу обратить ваше внимание!

Что запись будет производиться "ВСЕГДА" в конец массива. Но нам нужно, чтобы свежая запись всегда была сверху. Просто, чтобы не мучаться с реверсом при выдаче, лучше помучаться с реверсом при записи!

Собака "@" нужна для того, чтобы при не существующем массиве, не выдавало ошибку.

Из нашего будущего файла "$dir_rotate" - путь естественно должен быть на сервере

Нам понадобится функция unserialize

Переменная "$reverse_ok" - нам понадобится ниже, - надеюсь по названию понятно почему!? Чтобы развернуть массив.

Ниже. тот массив, который мы создавали. в предыдущем пункте.

$example_main_array[$page_id][title] = 'База данных или файл данных';

$example_main_array[$page_id][description] = 'Хранение данных база или файл?';

Далее проверяем был ли перевернут массив $reverse_ok, если да, то возвращаем в нормальное направление

Нам нужна строка, поэтому превратим массив в строку - serialize

$write_for_main = @file_put_contents($dir_rotate, serialize($example_main_array));

Соберем весь код вместе:

$example_main_array[$page_id][title] = 'База данных или файл?';

$write_for_main = @file_put_contents($dir_rotate, serialize($example_main_array));

Форма ввода для записи в файл .dat

Нам нужна форма для записи данных в базу в файле .dat, какие данные будем записывать!?

Дату - создания записи - date('d.m.Y').

Картинка, либо будет загружаться новая, или же соответствует папке, в которой будет создаваться новая страница. Если вы думаете, что на каждую новую страницу будете делать новую картинку, то к 10-20 странице вам надоест! Поэтому рекомендую на каждую подтему создать картинку, и чтобы она автоматически загружалась. Чтобы не мучаться, сделаем как у меня на сайте. А уж если вы захотите. то сами измените, так, как вам надо.

Далее два поля, изменим название ячеек в соответствии с "POST", чтобы потом не путаться! - поскольку они обязательны required, то никаеи условия можно не писать.

$example_main_array[$page_id][title_for_main] = $_POST['title_for_main'];
$example_main_array[$page_id][description_for_main] = $_POST['description_for_main'];

Насчет ячейки авторства, если мы говорим, об авторском сайте, то это не обязательно.

Две ячейки и [url] - на них остановимся на отдельных страницах, потому, что в двух словах тут не получится.

PHP → filesDataStorage. NoSQL-база данных на файлах

Позавчера пришла в голову идея написать для phpMyEngine файловый вариант хранения данных.
Ведь не всегда нужна большая БД (Mongo например), особенно на сайтах-визитках с 3-10 страницами.
В итоге родился отдельный продукт <filesDataStorage>, чем-то напоминающий MongoDB :)

Под катом самое интересное :)

Создание хранилища данных

Для начала создадим директорию, в которой будут храниться наши данные, например /home/user/data/
теперь создадим в /home/user/app/ файл index.php — наше приложение и «подключимся» к базе данных.

Существует три вида запросов к базе данных:
get — получение данных
save — сохранение данных
remove — удаление данных

Рассмотрим каждый из них подробнее:

Описания принимаемых параметров:

$collection — По образу и подобию MongoDB, данные храняться в коллекциях, что позволяет логически их разделять
$data — массив с данными
$limit — лимит на выборку
$offset — отступ
$order — тип сортировки, числовой параметр, 1 — DESC, -1 — ASC и 2 — RAND
$orderBy — поле, по которому будет осуществлена сортировка


С этими функциями думаю всё ясно и без объяснений ;)

Данные
Как мы выяснили в прошлом разделе — данные передаются массивом, и так, по-пробуем создать нашу первую запись.
Вернёмся к index.php

каждая запись обязательно должна иметь уникальное свойство _id.
Теперь сохраним данные в базу.


Выборки
Для начала сохраним то, что будем потом искать :)


А теперь попробуем найти все приветствия миру

в результате мы получим:

array
0 =>
array
'_id' => string '4cc67321351e0' (length=13)
'hello' =>
array
'to' => string 'world' (length=5)
'from' => string 'xmcdbx' (length=6)

Но, что делать, если нужно сделать более сложную выборку? Ответ очевиден — делать :)
Для данных существует 9 операций сравнения:

  1. $gt — больше
  2. $lt — меньше
  3. $gte — больше или равно
  4. $lte — меньше или равно
  5. $ne — не равно
  6. $btw — в интервале
  7. $in — содержится в массиве значений
  8. $nin — не содержится в массиве значений
  9. $all — массив-значение, должно полностью содержаться в значения поля


Сортировка значений, лимитирование выборки
Рассмотрим такой пример:

Здесь мы выбираем 4 случайных значения, начиная со второго сдвига.
$order может принимать следующие значения:

Так же можно осуществлять сортировку по значению внутри «объекта»:

где hello — имя объекта, to -поле объекта.

В следуюшей статье приведу результаты тестирование производительности в сравнении с textSQL,YNDb и возможно другими файловыми БД.

Читайте также: