Re: Указатель на произвольные данные в структуре ngx_connection_s
Maxim Dounin
mdounin на mdounin.ru
Пт Мар 24 12:20:45 UTC 2017
Hello!
On Fri, Mar 24, 2017 at 12:44:10PM +0300, Pavel Balaev wrote:
> Добрый день.
>
> Я пытаюсь написать модуль, который должен хранить некоторые произвольные
> данные на протяжении времени жизни сессии (keep-alive). В структуре ngx_connection_s есть
> пул памяти, при первом реквесте я аллоцирую память для ctx =
> ngx_pcalloc(r->connection->pool,..., но проблема в том, что полученный
> адрес негде прикрепить. Локально я пропатчил структуру ngx_connection_s и сохраняю
> указатель в r->connection->ctx. У меня есть подозрения, что я делаю
> что-то не так.
Лучше всего - не пытаться ничего хранить "на протяжении времени
жизни сессии", вас ждут сюрпризы с тем, когда именно и по каким
причинам соеденение может закрываться, а равно с тем, какие именно
запросы могут присутствовать в одном соединении. Протокол HTTP не
предусматривает какой-либо зависимости от соединения, и не надо её
вводить - а то получится, как у MS NTLM-авторизацией для HTTP:
вроде и есть, но противоречит протоколу, и в любых конфигурациях,
отличных от тривиальных, скорее не работает, чем работает.
Если изложенное выше вас не переубедило, и вы хорошо понимаете,
зачем вам хранить данные именно в соединении - то это можно
сделать в форме pool cleanup handler'а: добавить свой cleanup
handler с помощью ngx_pool_cleanup_add(), а при необходимости
получить данные обратно - найти его в списке c->pool->cleanup.
Пример подобного хранения данных (правда, в пуле запроса, а не
соединения) можно посмотреть, например, в модуле realip.
--
Maxim Dounin
http://nginx.org/
Подробная информация о списке рассылки nginx-ru