Операции записи и чтения осуществляются быстрее при работе с файловой системой, по сравнению с иерархической базой данных и, конечно, быстрее, чем при работе с реляционной базой данных. Поэтому там, где нужна скорость(например, в поисковых системах), прибегают к плоским файлам — API(набор функций) к драйверу, обеспечивающему простейшие операции помещения записи в файл и извлечения их. То есть создается подобие примитивной базы данных, обеспечивающей работу с файлами как с набором строк. Зазумеется, в случае плоских файлов не может идти речь о поиске или каких-либо встроенных функциях — для этого предназначены реляционные базы данных, например MySQL, которая будет рассмотрена позднее.
Плоские файлы — это точно такие же файлы, как и рассмотренные нами ранее, но часто в двоичном или упакованном виде, позволяющем быстрее осуществлять операции извлечения, удаления и редактирования записей при помощи стандартного набора функций, избавляя программиста от забот о создании собственных библиотек для работы с текстовыми файлами. В состав РНР входит большое число расширений, позволяющих работать с различными видами плоских файлов и разновидностей баз данных Berkeley. Стандартным в настоящий момент считается доступ через расширение dba-функций(Database Abstraction Layer) — единый интерфейс к такого рода файлам.
Примечание. Для подключения расширения dba, которое, как и все остальные расширения, по умолчанию отключено, следует снять комментарий с директивы extension=php_dba.dll в конфигурационном файле php.ini.
Для открытия и создания плоского файла предназначена функция dba_open(), которая имеет следующий синтаксис:
resource dba_open(string name, string mode, string handler)
В качестве первого аргумента функция принимает параметр name с указанием имени файла. Второй параметр mode содержит символы, задающие режим открытия файла, и может принимать следующие значения:
Последний параметр handler определяет тип базы данных или плоского файла и может принимать следующие значения: dbm, ndbm, gdbm, db2, db3, db4, cdb, cdb_make, flatfile, inifile, qdbm. В основном это различные разновидности баз данных Berkeley DB. Нас будет интересовать тип flatfile — плоский файл.
Примечание. Не все форматы доступны по умолчанию, ряд из них конфликтует друг с другом. Для того чтобы выяснить, какие базы данных доступны в системе, следует воспользоваться функцией dba_handlers(), которая не принимает никаких аргументов и возвращает массив из имен доступных баз данных. Самый простой способ получить список баз данных — выполнить команду print_r(dba_handlers()).
Примечание. Функция dba_list(), которая не принимает никаких аргументов, возвращает массив из полных путей к файлам, открытых в настоящий момент.
В случае успешного выполнения функция возвращает дескриптор открываемого файла, а в случае неудачи — false.
Рассмотрим пример создания плоского файла.
Создание плоского файла
<?php
//создаем файл test.db
$id-=dba_open("test.db", "c", "flatfile");
//закрываем соединение
dba_close($id);
?>
Результатом работы будет пустой файл test.db. Обратите внимание, что как и обычные файлы, в конце скрипта следует закрыть соединение, для чего предназначена специальная функция dba_close().
После того как файл создан, можно приступить к заполнению его информацией. Для вставки в файл записей типа "ключ-значение" предназначена функция dba_insert(), которая имеет следующий синтаксис:
bool dba_insert(string key, string value, resource handle)
В качестве первого параметра key функция принимает строку с ключем записи, в качестве второго value — значение записи. Последний параметр определяет значение, которое передается дескриптору открытого функцией mda_open() файла. При успешном выполнении функция возвращает true, в случае неудачи — false.
Пример.
Заполнение файла
<?php
//открываем файл test.db
$id=dba_open("test.db", "w", "flatfile");
//проверяем корректность открытия файла
if(!$id) exit("Невозможно открыть файл");
//функция dba_insert() принимает три параметра:
//первый - ключ, второй -значение, третий - дескриптор
dba_insert("1", "Привет, всем!", $id);
dba_insert("2", "Тест на заполнение файла", $id);
//закрываем файл
dba_close($id);
?>
Cкрипт заносит в ранее созданный файл test.db две записи.
Примечание. Формат flatfile не позволяет помещать записи с одинаковыми значениями ключей. Если в файл необходимо поместить несколько записей с одинаковыми ключами, следует воспользоваться форматом, поддерживающим такое поведение, например, cdb.
Примечание. Плоские файлы не допускают вставку нескольких значений для одной записи. Для того, чтобы сохранить в одной записи несколько значений, следует разместить их в массиве и упаковать его в строку при помощи функции serialize(), а при извлечении записи распаковать обратно в массив при помощи функции unserialize().
После того как файл создан, из него можно извлекать занесенную ранее информацию. Для этого предназначен набор функций, первой из которых является функция dba_exists(), которая проверяет существование ключа в плоском файле и имеет следующий синтаксис:
bool dba_exists(string key, resource handle)
Функция принимает в качестве первого аргумента ключ key, а в качестве второго — дескриптор файла, возвращаемый функцией mda_open(). Если ключ key найден в файле, возвращается true, в противном случае — false.
Рассмотрим пример работы функции dba_exists().
Функция dba_exists()
<?php
//открываем файл test.db
$id=dba_open("test.db", "r", "flatfile");
//проверяем корректность открытия файла
if(!$id) exit("Невозможно открыть файл");
//функция dba_insert() принимает три параметра:
//первый - ключ, второй -значение, третий - дескриптор
if(dba_exists("1", $id)) echo "Ключ существует <br>";
else echo "Такой ключ отсутствует <br>";
if (dba_exists("4", $id)) echo "Ключ существует <br>";
else echo "Такой ключ отсутствует<br>";
//закрываем файл
dba_close($id);
?>
Первый вызов функции приводит к выводу строки "Ключ существует", т.к. ранее в файл test.db нами была добавлена запись с ключем "1". Проверка на существование записи с ключем "4" приводит к выводу записи "Такой ключ отсутствует".
После того как существование ключа проверено, можно осуществлять извлечение записи. Для этого предназначена функция dba_fetch(), которая по ключу извлекает из файла соответствующее ему значение и имеет следующий синтаксис:
string dba_fetch(string key, resource handle)
В качестве первого аргумента key передается ключ файла, в качестве второго — дескриптор, возвращаемый функцией dba_open(). Функция возвращает значение, соответствующее ключу.
Примечание. Если используемая база данных, поддерживающая создание записей с одинаковыми ключами, например cdb, после параметра key допускается использование дополнительного параметра skip, задающего число записей с ключем key, которые следует пропустить.
Пример.
Функция dba_fetch()
<?php
//открываем файл test.db
$id=dba_open("test.db", "r", "flatfile");
//проверяем корректность открытия файла
if(!$id) exit("Невозможно открыть файл");
$key="2";
//если ключ существует
if(dba_exists($key, $id))
{
//извлекаем соответствующее ему значение
echo dba_fetch($key, $id);
}
//закрываем файл
dba_close($id);
?>
В результате работы скрипта в окно браузера будет выведена строка "Тест на заполнение файла ".
Если ключи плоского файла заранее не известны, имеется возможность последовательного извлечения записей из файла, начиная с первой записи. Функция dba_firskey() возвращает ключ первой записи и имеет следующий синтаксис:
string dba_firskey(resource handle)
Функция принимает дескриптор открытого файла handle и возвращает ключ первой записи файла. Вслучае неудачи возвращает false.
Функция dba_nextkey() возвращает ключ следующей записи. Последовательным вызовом данной функции можно перебрать весь файл. После того как функция вернет ключ последней записи, щна возвращает false.
Пример.
Последовательное чтение плоского файла
<?php
//открываем файл test.db
$id=dba_open("test.db", "r", "flatfile");
//проверяем корректность открытия файла
if(!$id) exit("Невозможно открыть файл");
//извлекаем ключ первой записи
$key=dba_firstkey($id);
//выводим значение первой записи
echo dba_fetch($key, $id). "<br>";
//в цикле извлекаем следующие записи
while($key=dba_nextkey($id))
{
echo dba_fetch($key, $id). "<br>";
}
//закрываем файл
dba_close($id);
?>
В результате работы скрипта происходит последовательное чтение плоского файла — в цикле выводится значение всех записей.
По ключу можно заменить значение уже существующей записи на новое. Для этого предназначена функция dba_replace(), которая имеет следующий синтаксис:
bool dba_replace(string key, string value, resource handle)
Функция принимает в качестве первого параметра key ключ записи, в качестве второго value — значение, в качестве третьего handle — дескриптор, возвращенный функцией dba_open(). Функция возвращает true в случае успешного выполнения и false в случае неудачи.
Примечание. Если в качестве ключа key функции dba_replace() будет передан ключ несуществующей записи, такая запись будет создана.
Пример.
Функция dba_replace()
<?php
//открываем файл test.db
$id=dba_open("test.db", "r", "flatfile");
//проверяем корректность открытия файла
if(!$id) exit("Невозможно открыть файл");
//извлекаем ключ первой записи
$key=dba_firstkey($id);
//выводим значение первой записи
echo dba_fetch($key, $id). "<br>";
//в цикле извлекаем следующие записи
while($key=dba_nextkey($id))
{
echo dba_fetch($key, $id). "<br>";
}
//закрываем файл
dba_close($id);
?>
В результате работы скрипта в окно браузера будет выведена строка "Повторяем тестирование".
Последней операцией, которую поддерживают плоские файлы, является операция удаления записей. Для удаления записей предназначена функция dba_delete(), которая имеет следующий синтаксис:
bool dba_delete(string key, resourse handle)
Функция принимает в качестве первого параметра значение ключа key удаляемой записи, а в качестве второго параметра handle — дескриптор открытого файла. В случае удачного выполнения функция возвращает true, а в случае неудачи — false.
В примере производится удаление всех записей из файла test.db.
Пример удаления плоского файла
<?php
//открываем файл test.db
$id=dba_open("test.db", "w", "flatfile");
//проверяем корректность открытия файла
if(!$id) exit("Невозможно открыть файл");
//извлекаем ключ первой записи
$key=dba_firstkey($id);
//удаляем первую запись
dba_delete($key,$id);
//удаляем запись
while($key=dba_nextkey($id))
{
dba_delete($key, $id);
}
//закрываем файл
dba_close($id);
?>