Работа с базами данных, состоящих из текстовых файлов

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

Решение
Используйте текстовый файл с необязательной блокировкой для предотвращения конфликтов. Можно хранить данные в любом подходящем формате (CSV, с разделителем – вертикальной чертой и т. д.) Один из удобных способов хранения данных состоит в их размещении в одной переменной (большом ассоциативном массиве), с последующим сохранением путем применения к этой переменной функции serialize():

$data_file = '/tmp/data';
// открываем файл для чтения и записи
$fh = fopen($data_file,'a+') or die($php_errormsg);
rewind($fh) or die($php_errormsg);
// устанавливаем монопольную блокировку файла
flock($fh,LOCK_EX) or die($php_errormsg);
// читаем и выполняем обратное преобразование данных
// из последовательной формы
$serialized_data = fread($fh,filesize($data_file)) or die($php_errormsg);
$data = unserialize($serialized_data);
/*
* выполняем необходимые действия с данными
*/
// повторно переводим данные в последовательную форму
$serialized_data = serialize($data);
// очищаем файл
rewind($fh) or die($php_errormsg);
ftruncate($fp,0) or die($php_errormsg);
// записываем данные обратно в файл и снимаем блокировку
if (-1 == (fwrite($fh,$serialized_data))) { die($php_errormsg); }
fflush($fh) or die($php_errormsg);
flock($fh,LOCK_UN) or die($php_errormsg);
fclose($fh) or die($php_errormsg);

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


Его главные недостатки – неповоротливость и неэффективность. Сначала необходимо заблокировать файл, а затем извлекать из него все данные подряд, даже если
требуется лишь малая их часть. Пока блокировка не будет снята, все остальные процессы, а, следовательно, и все остальные пользователи будут вынуждены ждать, слоняясь без дела. Одно из ценных свойств базы данных состоит в том, что она предоставляет структурированный доступ к информации, что дает возможность блокировать (и загружать
в память) только те данные, которые действительно требуются. Решение на основе текстовых файлов этого не позволяет.

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

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Автоматическое присваивание уникальных значений идентификаторов
Выполнение запросов к базе данных SQL
Извлечение строк без цикла
Кэширование запросов и результатов
Модификация данных в базе данных SQL

Вернуться в раздел: PHP / 10. Доступ к базам данных