Как стать автором
Обновить

http_handlersocket_json_module

Время на прочтение 3 мин
Количество просмотров 1.7K
О назначении модуля можно догодаться из названия. О HandlerSocket говорят много и на разных языках (в основном на японском, английском и последнее время немного на русском).
Модуль NGX_HTTP_HANDLERSOCKET_JSON_MODULE обращается к данным MySQL через протокол HandlerSocket и отдает данные в формате JSON. Область применения AJAX.
Исходники

О конфигурации, особенностях и ограничениях можно почиать ниже.

Инсталляция

Инсталляция стандартная, конфигурирование с опцией --add-module:

./configure --add-module=/full/path/to/dir/nginx_http_handlersocket_json_module
далее
make & sudo make install;
Конфигурация

Конфигурация определена в контексте локейшена. Пример ниже:
location ~ /json/(.+)/{
hs_json;
 
 hs_json_host  127.0.0.1;
 hs_json_port  9998;
 
 hs_json_db test;
 hs_json_table hs_test;
 
 hs_json_index code;  # PRIMARY default
   hs_json_fields keyid,value,code;
 
 hs_json_op "="; # = default
 hs_json_limit 10; # default 10
 
set $hs_request $1;
}


Более подробно:

hs_json; — активирует модуль

Параметры соединения (хост и порт по умолчанию localhost:9998, так что можно не указывать, а вот имя базы данных указать прийдется обязательно):
hs_json_host 127.0.0.1;
hs_json_port 9998;
hs_json_db test;

Таблица данных и список выбранных полей (все параметры обязательные):
hs_json_table hs_test;
hs_json_fields keyid,value,code;

Индекс, по которому должна осуществляться выборка:
hs_json_index code;
При отсутствии данной опции используется PRIMARY индекс.

Операция, это условие по выборке данных.
hs_json_op "="; # = default
Возможны следующие операции: =, <, <=, >, >=
По умолчанию, при отсутствие директивы применяется операция «равно»

Ограничение на вывод данных:
hs_json_limit 10;
При отсутствии директивы 10.

Условие на выбор данных, осуществляется через переменную $hs_request. Данные можно назначить как часть урла:
location ~ /json/(.+)/{
set $hs_request $1;
  }
Как переменную GET или COOKIES:
location ~ /json {
set $hs_request $get_id;
}

ПРИМЕР:
Пусть необходимо выбрать города по нескольким первым буквам. Список ограничен 10 позициями. Города выбираются из таблицы:
CREATE TABLE city {
name VARCHAR(45),
id INT,
PRIMARY (id),
KEY `name` (`name`),
}
Если использовать следующую часть конфига:
location ~ /city/(.+)/${
..... // параметры соединения
hs_json_index name,
hs_json_fields name;
hs_json_op ">=";
set $hs_request $1;
}

то это будет аналог запроса: SELECT * FROM cities WHERE city_name >= '$hs_request' LIMIT 10
Запрос будет браться из последней части урл, Наприме для запроса: http: // myserver.com/city/san/ будет сформирован набор даных:
[{"name":"San Amaro"},{"name":"San Andreas"},{"name":"San Andrs"} ... ]
Ошибки

  1. 500 — неправильная конфигурация, ошибка реализации протокола или ошибка ответа HS
  2. 503 — нет соединения с HS или ошибки ввода/вывода
Если ключ не найден — отдается пустой ответ: {[]}, 404 ошибка не формируется.

Ограничения
  • Величина выходного буфера должна быть не более 1К (1024), регулируется #define BUFF_SIZE. Для моих задач больше не нужно.
  • Можно использовать только простой индекс (выборка данных только по одному критерию)
  • пока русские буквы не реализованы (UTF-8), устранится в ближайшее время

О всех багах в багрепорте, о фичах и пожеланиях в личку или комменты
Теги:
Хабы:
+32
Комментарии 52
Комментарии Комментарии 52

Публикации

Истории

Ближайшие события

PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн
Weekend Offer в AliExpress
Дата 20 – 21 апреля
Время 10:00 – 20:00
Место
Онлайн