Search
Write a publication
Pull to refresh

Установка/Настройка KPHP/KDB

Как многие уже знают, не так давно состоялся релиз KPHP и его движков. Меня сразу заинтересовала данная тема, но единомышленников оказалось найти довольно сложно. Может, из-за скудной документации разработчиков, может, потому что мы не очень любим отечественного производителя — ожидаемого бума данный софт не получил.

Сегодня, в данной статье, мы рассмотрим:

  1. Как скомпилировать KPHP/KDB движки.
  2. Как настроить Engine для работы.
  3. Скомпилируем Kphp Web-сервер.
  4. Запустим один из самых простых движков — Persistent Memcached.

Официальный репозиторий с кодом: github.com/vk-com/kphp-kdb
Документация от разработчиков: github.com/vk-com/kphp-kdb/tree/master/docs/ru
Не официальный репозиторий: github.com/ximik777/kphp-kdb
Не официальный репозиторий это форкнутый проект. В нем устранено несколько существенных и не существенных ошибок, а так же добавлено несколько фич (оригинальные функции не затронуты).

Если в будущем Вам необходимо будет работать из KPHP с MySQL сервером, тогда советую использовать неофициальный репозиторий, так-как в оригинальном эта функция не работает.

Все сборку будем производить на Ubuntu 12.04.

Итак приступим:

1. Компиляция KPHP и KDB.


Устанавливаем необходимые пакеты для работы:
sudo apt-get install git-core openssl zlib1g-dev libcg libpcre3-dev libssl-dev build-essential


Ставим libre2:
wget re2.googlecode.com/files/re2-20140304.tgz
tar -zxvf re2-20140304.tgz
cd re2/
make
make test (Не обращаем внимание на ошибку если выпадает)
make install
make testinstall

cd /usr/local/src/

Клонируем репозиторий:
git clone github.com/vk-com/kphp-kdb

или неофициальный:
git clone github.com/ximik777/kphp-kdb

cd /usr/local/src/kphp-kdb/

Собираем KPHP:
make kphp

Собираем KDB (за исключением image, filesys, spell, tl, binlog):
make all


Нам потребуется пользователь kitten, домашняя директория должна располагаться в /var/lib/engine.
/var/lib/engine — это не обязательное требование, но для нормальной работы движков работающих с бинарными логами это будет идеальное место.
mkdir /var/lib/engine
sudo useradd kitten -b /var/lib/engine -u 239
chown -R kitten:kitten /var/lib/engine/


2. Настройка Engine.


Engine — это демонизатор наших движков, проще говоря — старт/стоп скрипт.

Создаем необходимые каталоги:
mkdir /usr/share/engine/
mkdir /usr/share/engine/bin/
mkdir /var/log/engine/
mkdir /etc/engine


Копируем собранные движки, и rd скрипты:
cp /usr/local/src/kphp-kdb/objs/bin/* /usr/share/engine/bin/
cp /usr/local/src/kphp-kdb/scripts/debian-init.d-engine /etc/init.d/engine
cp /usr/local/src/kphp-kdb/scripts/_etc_logrotate.d_engine /etc/logrotate.d/engine
cp /usr/local/src/kphp-kdb/scripts/start-engine /usr/share/engine/bin/


Настраиваем ротацию логов:
logrotate -d /etc/logrotate.d/engine
logrotate -v -f /etc/logrotate.d/engine


3. Пример компиляции одного php файла в Kphp


Создаем директорию для тестов:
mkdir /var/www/testkphp
cd /var/www/testkphp/

Для примера возьмем файл бенчмарка, чтобы сразу убедиться в производительности.
wget gist.githubusercontent.com/anonymous/9391146/raw/9b3f6a07acb8f0e735b823ec4f7def6994f4c412/bench.php

Задаем глобальную переменную для компилятора kphp:
export KPHP_PATH=/usr/local/src/kphp-kdb

И наконец компилируем наш файл bench.php в программу:
python /usr/local/src/kphp-kdb/KPHP/tests/kphp.py bench.php -o bench

На выходе получаем исполняемый файл bench.
Запускаем:
./bench

Мы должны увидеть таблицу тестов, что то типа такого:
simple 0.000
simplecall 0.000
simpleucall 0.010
simpleudcall 0.010
mandel 0.006
mandel2 0.008
ackermann(7) 0.001
ary(50000) 0.003
ary2(50000) 0.002
ary3(2000) 0.023
fibo(30) 0.004
hash1(50000) 0.015
hash2(500) 0.013
heapsort(20000) 0.009
matrix(20) 0.009
nestedloop(12) 0.000
sieve(30) 0.018
strcat(200000) 0.005
— Total 0.137

Для сравнения можем запустить php файл:
php bench.php

Впечатляет не правда ли?

Но это мы скомпилировали всего лишь программу, а нам нужен web-сервер. Для этого компилируем наш файл с ключом -n:
python /usr/local/src/kphp-kdb/KPHP/tests/kphp.py bench.php -o server -n

На выходе мы получаем готовый Web-сервер.
Запускаем сервер на порту 8080(или на любом свободном):
./server -H 8080

Проверяем, открываем в браузере:
127.0.0.1:8080

Теперь можно проксировать запросы к данному серверу через nginx.
Остальные настройки можем увидеть с помощью ключа -h:
./server -h

Список функций которые поддерживает kphp находится здесь:
/usr/local/src/kphp-kdb/KPHP/functions.txt

Если при запуске скомпилированного kphp сервера будет выпадать ошибка:
error while loading shared libraries: libre2.so.0: cannot open shared object file: No such file or directory
Нужно задать LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/lib/



4. Настройка/Запуск Persistent Memcached


Описание:
Надежное key-value хранилище, позволяющее хранить данные без ограничения по времени. По протоколу MC движок работает идентично Memcache, за исключением того, что после перезагрузки все данные остаются.
Помимо своих основных функций, при включении соответствующей опции в конфигурации pmemcached позволяет получать сразу группы записей, у которых префикс ключа соответствует заданному в запросе.

Для работы данного движка необходим бинарный лог в котором будет хранится вся информация.
Разработчики приложили специальную утилиту create_binlog.sh с помощью которой можно создать бинлог практически для любого движка.
Создаем бинлог:
/usr/local/src/kphp-kdb/scripts/create_binlog.sh 0x37450101 1 0 > /var/lib/engine/pmemcached.bin

Даем права:
chown -R kitten:kitten /var/lib/engine/

Теперь необходимо создать конфигурационный файл запуска для Engine'a:
vim /etc/engine/engine.pmc.conf

Вставляем содержимое:
execute pmemcached-disk
arg1 pmemcached
-p 11209

execute pmemcached-disk — указывает на то, какой движок будем использовать,
arg1 pmemcached — название файла бинлога,
-p 11209 — на каком порту будет запущен данный движок.
Запускаем:
service engine start pmc

Смотрим статус:
service engine status

Если движок аварийно завершил работу, смотрим в логи:
cat /var/log/engine/engine-pmc.log

Как и говорилось выше особенность данного движка это — бинлог, который после перезапуска восстанавливает все ключи и значения обратно в память и получение записей по префиксу ключа.
Подключаемся к движку через обычный интерфейс Memcache.
$pmc = new Memcache;
$pmc->addServer('localhost', 11209);

Добавляем записи:
$pmc->set('my_test1', 'test_value_1');
$pmc->set('my_test2', array(1,'foo'=>'bar',3));
$pmc->set('my_test3', 11211);
$pmc->set('my_ololo', 'ololo');

Попробуем получить ключи по префиксу:
print_r($pmc->get('my_test#'));

Результат должен быть следующим:
Array
(
[1] => test_value_1
[2] => Array
(
[0] => 1
[foo] => bar
[1] => 3
)
[3] => 11211
)


Теперь если сдвинуть знак # таким образом:
print_r($pmc->get('my_#'));

Получим следующий результат:
Array
(
[ololo] => ololo
[test1] => test_value_1
[test2] => Array
(
[0] => 1
[foo] => bar
[1] => 3
)
[test3] => 11211
)

Теперь можно перезапустить движок, чтобы убедится, что все данные остались на месте:
service engine pmc restart


В следующей статье планирую рассказать об устройстве и настройке Storage-Engine.

Спасибо за внимание!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.