Операции записи и чтения осуществляются быстрее при работе с файловой системой, по сравнению с иерархической базой данных и, конечно, быстрее, чем при работе с реляционной базой данных. Поэтому там, где нужна скорость(например, в поисковых системах), прибегают к плоским файлам — 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 содержит символы, задающие режим открытия файла, и может принимать следующие значения:
r
— чтение;w
— запись;с
— создание.
Последний параметр 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()
.
<?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
, которые следует пропустить.
Пример.
<?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()
будет передан ключ несуществующей записи, такая запись будет создана.
Пример.
<?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);
?>
Комментарии(0)
Для добавления комментариев надо войти в систему и авторизоватьсяКомментирование статей доступно только для зарегистрированных пользователей:Зарегистрироваться