PurePHP — NoSQL база данных на чистом PHP

19 Марта 2014

На PHP создано куча разных штук: веб-сервер, контроллер квадрокоптера и даже GUI. Я решил пополнить список странных штук и создать NoSQL базу данных на чистом PHP.

Готовый результат выложен на GitHub: elfet/purephp

Посмотрим, что умеет эта “база данных”…

Для установки скачайте phar архив и выполните следующие команды:

mv pure.phar /usr/local/bin/pure
chmod +x /usr/local/bin/pure
Кстати, phar архив умеет сам обновляться до новой версии. Вам нужно всего лишь выполнить команду pure update.

Теперь вы можете запустить демона командой pure start. По умолчанию PurePHP запускается на 1337 порту и 127.0.0.1 хосте. Вы можете указать другой порт и хост с помощью соответствующих опций pure start --port="..." --host="...".

Для установки клиента PurePHP воспользуйтесь composer-ом:

composer require elfet/pure:0.*

Теперь мы можем подключиться к PurePHP из нашего приложения:

$pure = new Pure\Client($port, $host);

В PurePHP реализовано несколько видов хранилищ данных. Все они расположены в папке src/Storage. На клиенте вы можете работать с ними так, как будто бы вы работаете с ними напрямую. Для создания экземпляра хранилища используйте соответствующую функцию.

Примеры:

Создаём хранилище типа ArrayStorage, называем его ‘collection’ и помещаем в него массив ['hello' => 'world']:

$pure->of('collection')->push(['hello' => 'wolrd']);

Создаём хранилище типа QueueStorage, называем его ‘collection’ и помещаем в него строку 'wow!':

$pure->queue('collection')->push('wow!');

Получаем хранилище ‘collection’ и получаем верхний элемент очереди:

$wow = $pure->stack('collection')->pop(); // Вернёт 'wow!'

Сейчас реализованы следующие хранилища:

  • ArrayStorage ->of - простой массив.
  • StackStorage ->stack - стэк SplStack.
  • QueueStorage ->queue - очередь SqlQueue.
  • PriorityQueueStorage ->priority - очередь с приоритетом SplPriorityQueue.
  • LifetimeStorage ->lifetime - массив с временем жизни. Указывается количество секунд, через которое данный элемент будет удалён.
Для доступа к коллекциям можно воспользоваться магичискими методами:
$pure->of->collection->push();
$pure->stack->collection->pop();
//...

Также у всех хранилищ реализована особая функция filter. Она позволяет отобрать только нужные элементы:

$result = $pure->queue('collection')->filter('value > 100');

Также можно в ней задать лимит количества искомых элементов:

$result = $pure->prioriry('collection')->filter('value > 100', 10);

Выражения для функции filter пишутся на Expression Language и кешируются на сервере. В выражениях доступны две переменные: value и key.

$result = $pure->of('collection')->filter('value["year"] > 2000 and value["name"] matches "/term/"');

Консоль

Попробовать PurePHP можно и прямо из консоли. Запустите сервер PurePHP и в другом окне консоли наберите команду pure client. Тут вы можете попробовать все функции PurePHP. Например:

$ pure client
Welcome to Console Client for PurePHP server.
> pure.queue.collection.push('hello')
NULL
> pure.queue.collection.push('world')
NULL
> pure.queue.collection.pop() ~ ' ' ~ pure.queue.collection.pop()
string(11) "hello world"

Для выхода из режима консоли наберите команду exit.

Ради интереса я сравнил скорость работы PurePHP с Memcached. Естественно PurePHP проигрывает Memcached в 5 раз. =) Однако у меня не было цели создать что-либо быстрее или лучше, моя цель была сделать это на PHP, и я сделал это. По-моему, получилось очень забавно. Однако практического применения PurePHP пока нет. =)