Разработчику. Сборник рецептов PHP
Задавайте вопросы

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

Вернуться назад

Задача

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

Решение

Используйте текстовый файл с необязательной блокировкой для предотвращения конфликтов. Можно хранить данные в любом подходящем формате (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() осуществляет блокировку файлов, называемую необязательной, поэтому единственное, что может помешать многочисленным процессам передавить друг друга и испортить ваши данные,это хорошие манеры и аккуратное программирование. Но нет защиты от злоумышленных или добропорядочных, но плохо написанных программ.

См. также

Документацию по функции flock() на http://www.php.net/flock, по функции serialize() на http://www.php.net/serialize и по функции unserialize() на http://www.php.net/unserialize.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования


Рейтинг Сайтов ДОСКИ.РУ