Apache isn't the fastest or maximally customizable web server, its popularity comes from the fact that it provides a very good balance of these things bundled with maximum portability and reliability.
Вы не зашли.
Некорректно я поставил вопрос.
Немного разобрался в проблеме, читайте следующий комментарий.
Интересную картину наблюдаю при работе с переменными, время жизни которых не ограничивается одним request или connection циклом.
Пробовал разные способы выделения динамической переменной через apr_palloc (c apr_pool_userdata_set и без) и в пул модуля, и в главный пул сервера, и с использованием мутекса, да даже просто через malloc в памяти, не связывая ни как с пулом соответственно. Как бы не пробовал - переменные живут только небольшое время. Если обращений к серверу нет ~минуту то ссылка обязательно обнуляется в любом случае. Хотя пул не пропадает вроде.
Подскажите пожалуйста какая логика работы сервера? Почему выделенная память пропадает даже из глобального пула после некоторого времени застоя?
static int test_handler(request_rec *r) { int *bb; void *dd = NULL; if (apr_pool_userdata_get (&dd, "my:data", r->server->process->pool) != APR_SUCCESS ) { jdc_echo_debug("data get bad"); } else { jdc_echo_debug("data get ok"); bb = (int*)dd; } if (dd == NULL) { echo_debug("dd == NULL"); bb = (int*) apr_palloc (jdc_pglobal, sizeof (int)); *bb = 17; dd = (void*)bb; apr_pool_userdata_set (dd, "my:data", NULL, r->server->process->pool); } else { *bb += 1; dd = (void*)bb; } echo_debug("bb = "); echo_debug_simple_i(*bb); r->content_type = "plain/text"; ap_rputs("OK", r); echo_debug("All OK"); return OK; }
Вот вывод:
DEBUG [16:49:55] : data get ok
DEBUG [16:49:55] : dd == NULL
DEBUG [16:49:55] : bb = 17
DEBUG [16:49:55] : All OK
DEBUG [16:50:00] : data get ok
DEBUG [16:50:00] : bb = 18
DEBUG [16:50:00] : All OK
DEBUG [16:50:04] : data get ok
DEBUG [16:50:04] : bb = 19
DEBUG [16:50:04] : All OK
DEBUG [16:51:30] : data get ok
DEBUG [16:51:30] : dd == NULL
DEBUG [16:51:30] : bb = 17
DEBUG [16:51:30] : All OK
Отредактированно PM85 (2008-04-14 08:23:05)
Неактивен
Интересное наблюдение сделал. Выделял большие объёмы памяти и смотрел процессы по используемым ресурсам.
Выделенная память действительно НЕ пропадает на протяжении всего времени жизни сервера, но через минуту apr_pool_userdata_get уже данных получить не может, потому что запрос обрабатывает уже другой поток сервера.
Значит нужно только как-то определять область памяти доступную всем потокам.
http://httpd.apache.org/docs/2.0/develo … afety.html - здесь написано что необходимо использовать функции apr_atomic_* и apr_thread_mutex_*. Так же нашёл группу функций apr_shm_*, но не могу понять чем и как пользоваться, чтобы выделить раздяемую потоками память.
Отредактированно PM85 (2008-04-14 08:20:58)
Неактивен
тебе Нужна общая память для всех модулей или только для одного!?
Если общая память для одного модуля то выделяй ее в
функциях создания и слияния;
module my_module = {
STANDARD20_MODULE_STUFF,
my_create_dir_conf, /* Создание конфигурации каталога */
my_merge_dir_conf, /* Слияние конфигураций каталогов */
my_create_svr_conf, /* Создание конфигурации сервера */
my_merge_svr_conf, /* Слияние конфигураций серверов */
my_cmds, /* Директивы конфигурации */
my_hooks
};
а вот если глобально видели все модули
то в структуре /2006/06/10/strukturyi-dannyih-apache-request_rec/ есть переменная apr_table_t *notes; через нее можно передавать
Неактивен
Память нужна для динамической работы. Не уверен, что после выделения её под конфиг она не копируется в область памяти каждого процесса сервера. В любом случае это не совсем кошерный метод.
Решил выделять ресурсы в каждом процессе отдельно. Небольшие потери ресурсов, зато конкретная стабильность.
Неактивен