Как многие уже знают, не так давно состоялся релиз KPHP и его движков. Меня сразу заинтересовала данная тема, но единомышленников оказалось найти довольно сложно. Может, из-за скудной документации разработчиков, может, потому что мы не очень любим отечественного производителя — ожидаемого бума данный софт не получил.
Сегодня, в данной статье, мы рассмотрим:
Официальный репозиторий с кодом: 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.
Итак приступим:
Устанавливаем необходимые пакеты для работы:
Ставим libre2:
Клонируем репозиторий:
или неофициальный:
Собираем KPHP:
Собираем KDB (за исключением image, filesys, spell, tl, binlog):
Нам потребуется пользователь kitten, домашняя директория должна располагаться в /var/lib/engine.
/var/lib/engine — это не обязательное требование, но для нормальной работы движков работающих с бинарными логами это будет идеальное место.
Engine — это демонизатор наших движков, проще говоря — старт/стоп скрипт.
Создаем необходимые каталоги:
Копируем собранные движки, и rd скрипты:
Настраиваем ротацию логов:
Создаем директорию для тестов:
Для примера возьмем файл бенчмарка, чтобы сразу убедиться в производительности.
Задаем глобальную переменную для компилятора kphp:
И наконец компилируем наш файл bench.php в программу:
На выходе получаем исполняемый файл bench.
Запускаем:
Мы должны увидеть таблицу тестов, что то типа такого:
Для сравнения можем запустить php файл:
Впечатляет не правда ли?
Но это мы скомпилировали всего лишь программу, а нам нужен web-сервер. Для этого компилируем наш файл с ключом -n:
На выходе мы получаем готовый Web-сервер.
Запускаем сервер на порту 8080(или на любом свободном):
Проверяем, открываем в браузере:
Теперь можно проксировать запросы к данному серверу через nginx.
Остальные настройки можем увидеть с помощью ключа -h:
Список функций которые поддерживает kphp находится здесь:
Описание:
Для работы данного движка необходим бинарный лог в котором будет хранится вся информация.
Разработчики приложили специальную утилиту create_binlog.sh с помощью которой можно создать бинлог практически для любого движка.
Создаем бинлог:
Даем права:
Теперь необходимо создать конфигурационный файл запуска для Engine'a:
Вставляем содержимое:
execute pmemcached-disk — указывает на то, какой движок будем использовать,
arg1 pmemcached — название файла бинлога,
-p 11209 — на каком порту будет запущен данный движок.
Запускаем:
Смотрим статус:
Если движок аварийно завершил работу, смотрим в логи:
Как и говорилось выше особенность данного движка это — бинлог, который после перезапуска восстанавливает все ключи и значения обратно в память и получение записей по префиксу ключа.
Подключаемся к движку через обычный интерфейс Memcache.
Добавляем записи:
Попробуем получить ключи по префиксу:
Результат должен быть следующим:
Теперь если сдвинуть знак # таким образом:
Получим следующий результат:
Теперь можно перезапустить движок, чтобы убедится, что все данные остались на месте:
В следующей статье планирую рассказать об устройстве и настройке Storage-Engine.
Спасибо за внимание!
Сегодня, в данной статье, мы рассмотрим:
- Как скомпилировать KPHP/KDB движки.
- Как настроить Engine для работы.
- Скомпилируем Kphp Web-сервер.
- Запустим один из самых простых движков — 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.
Спасибо за внимание!