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.
Вы не зашли.
В целях изучения создания модулей для Apache, необходимо разработать модуль, который при получении HTTP POST запросов, получал данные пришедшие в запросе и помещал их в mysql базу(как работать с этой субд с помощью mysql API тоже ясно).
Разобрался как создавать простейшие модули, как компилировать их с помощью Visual Studio (кто не знает - спрашивайте)
Вопросы:
1. При использовании ap_hook_post_read_request, в обработчик мы можем получить только первую строку запроса? Данных (того же пост-запроса) не можем?
Вроде бы необходимо создавать входящий фильтр?
использую ap_register_input_filter, фильтр вроде бы ставится (возращае эта функци указатель на ap_filter_rec_t , который на первый взгляд вполне корректен), но обработчик не вызывается...
2. в чем может быть причина такого поведения?
3. обьясните, пожалуйста тонкости таких видов обработчиков, которые ставятся так:
ap_register_input_filter("i-resource-2", x_input_filter, NULL, AP_FTYPE_RESOURCE) ;
ap_register_input_filter("i-content-1", x_input_filter, NULL, AP_FTYPE_CONTENT_SET) ;
ap_register_input_filter("i-content-2", x_input_filter, NULL, AP_FTYPE_CONTENT_SET) ;
ap_register_input_filter("i-protocol-1", x_input_filter, NULL, AP_FTYPE_PROTOCOL) ;
ap_register_input_filter("i-protocol-2", x_input_filter, NULL, AP_FTYPE_PROTOCOL) ;
ap_register_input_filter("i-transcode-1", x_input_filter, NULL, AP_FTYPE_TRANSCODE) ;
ap_register_input_filter("i-transcode-2", x_input_filter, NULL, AP_FTYPE_TRANSCODE) ;
ap_register_input_filter("i-connection-1", x_input_filter, NULL, AP_FTYPE_CONNECTION) ;
ap_register_input_filter("i-connection-2", x_input_filter, NULL, AP_FTYPE_CONNECTION) ;
ap_register_input_filter("i-network-1", x_input_filter, NULL, AP_FTYPE_NETWORK) ;
ap_register_input_filter("i-network-2", x_input_filter, NULL, AP_FTYPE_NETWORK) ;
Просьба поправить мои утверждения, если они не полные или вообще неверные.
Неактивен
unknow написал:
1. При использовании ap_hook_post_read_request, в обработчик мы можем получить только первую строку запроса? Данных (того же пост-запроса) не можем?
Конечно можем. С данными GET запроса все просто - все данные хранятся в request_rec->args
А в случае с POST запросом - используем в цикле функцию ap_get_client_block.
while ((len_read = ap_get_client_block(r, argsbuffer, sizeof(argsbuffer))) > 0) { // Накапливаем данные из argsbuffer }
unknow написал:
Вроде бы необходимо создавать входящий фильтр?
использую ap_register_input_filter, фильтр вроде бы ставится (возращае эта функци указатель на ap_filter_rec_t , который на первый взгляд вполне корректен), но обработчик не вызывается...
2. в чем может быть причина такого поведения?
После регистрации фильтра необходимо его добавить с помощью ap_add_input_filter
unknow написал:
3. обьясните, пожалуйста тонкости таких видов обработчиков, которые ставятся так:
ap_register_input_filter("i-resource-2", x_input_filter, NULL, AP_FTYPE_RESOURCE) ;
ap_register_input_filter("i-content-1", x_input_filter, NULL, AP_FTYPE_CONTENT_SET) ;
ap_register_input_filter("i-content-2", x_input_filter, NULL, AP_FTYPE_CONTENT_SET) ;
ap_register_input_filter("i-protocol-1", x_input_filter, NULL, AP_FTYPE_PROTOCOL) ;
ap_register_input_filter("i-protocol-2", x_input_filter, NULL, AP_FTYPE_PROTOCOL) ;
ap_register_input_filter("i-transcode-1", x_input_filter, NULL, AP_FTYPE_TRANSCODE) ;
ap_register_input_filter("i-transcode-2", x_input_filter, NULL, AP_FTYPE_TRANSCODE) ;
ap_register_input_filter("i-connection-1", x_input_filter, NULL, AP_FTYPE_CONNECTION) ;
ap_register_input_filter("i-connection-2", x_input_filter, NULL, AP_FTYPE_CONNECTION) ;
ap_register_input_filter("i-network-1", x_input_filter, NULL, AP_FTYPE_NETWORK) ;
ap_register_input_filter("i-network-2", x_input_filter, NULL, AP_FTYPE_NETWORK) ;
Тип фильтра (AP_FTYPE_RESOURCE, AP_FTYPE_CONTENT_SET и др.) определяет приоритет его вызова.
{ AP_FTYPE_RESOURCE = 10, AP_FTYPE_CONTENT_SET = 20, AP_FTYPE_PROTOCOL = 30, AP_FTYPE_TRANSCODE = 40, AP_FTYPE_CONNECTION = 50, AP_FTYPE_NETWORK = 60 } ap_filter_type;
Чем меньше значение, тем раньше вызовется фильтр. Если у фильтров одинаковый тип, то вызываются они в последовательности вызовов ap_add_*_filter()
Про типы фильтров и про функции работы с ними можно прочитать в статье Написание фильтров для Apache 2.0
Неактивен
Повторюсь немного, я собираюсь ставить 2 фильтра:
входной и выходной.
Теперь новые вопросы:
1. Необходимо подключиться к базе mysql, предварительно, до поступления запросов к серверу.
В каком обработчике это лучше сделать?
2. Обработка запросов, это анализ и выдача некоторых данных из mysql базы.
Понятное дело, что запросы в базу нужно свести к минимуму.
Обращение в базу это время и ресурсы, но когда есть необходимость в реал-тайм доступе в базу,
а не простого логгирования результатов в базу. Как можно оптимизировать этот процесс?
Насколько будет страдать производительность?
В обработчике входного фильтра я могу проводить достаточно много времени.
Так же задача базы - выдавать клиентам порции информации, есть ли смысл,
читать из базы данных большими блоками по X*размер порциями или же делать для каждого блока один запрос?
Неактивен
unknow написал:
1. Необходимо подключиться к базе mysql, предварительно, до поступления запросов к серверу.
В каком обработчике это лучше сделать?
Обычно такие вещи делают в post_config_hook, данный обработчик вызывается после запуска сервера и обработки конфигурации.
Прочитайте сперва Проблемы при создании модуля для Apache 2, в этой статье описаны некоторые тонкие моменты разработки модулей.
unknow написал:
2. Обработка запросов, это анализ и выдача некоторых данных из mysql базы.
Понятное дело, что запросы в базу нужно свести к минимуму.
Обращение в базу это время и ресурсы, но когда есть необходимость в реал-тайм доступе в базу,
а не простого логгирования результатов в базу. Как можно оптимизировать этот процесс?
Насколько будет страдать производительность?
Естественно, работа с бд влияет на производительность. Но, в любом случае, работа с базой данных из модуля Apache происходит быстрее, чем из скрипта.
unknow написал:
В обработчике входного фильтра я могу проводить достаточно много времени.
Так же задача базы - выдавать клиентам порции информации, есть ли смысл,
читать из базы данных большими блоками по X*размер порциями или же делать для каждого блока один запрос?
Все зависит от многих факторов: от количества запросов, от времени выборки данных и др. Если время выборки большое, то есть смысл сделать механизм кеширования данных бд. Попробуйте разные схемы, сравните их производительность и оставьте лучшую.
Неактивен
По поводу входных фильтров:
немного удалось разобраться с кодом на основе модуля dumpio
status = ap_get_brigade(f->next, bb, mode, block, readbytes);
if (status == APR_SUCCESS)
{
for (b = APR_BRIGADE_FIRST(bb); b != APR_BRIGADE_SENTINEL(bb); b = APR_BUCKET_NEXT(b))
{
dumpit(f, b);
}
} else
apr_bucket далее читаем эти данные apr_bucket_read().
Т.е. с получением самих данных вроде ясно.
А что делать при необходимости изменения их или удаления?
В принципе от же вопрос и для выходных фильтров
Неактивен
Вот тут есть пример работы с данными - Написание входных фильтров Apache.
Неактивен
unknow опубликовал статью на сайте - Что есть модули Apache2 под Microsoft Windows. В ней он как раз излагает процесс создания модуля с помощью VS.
А в качестве исходного текста модуля рекомендую взять код модуля mod_example.c
Исходник модуля и все необходимые заголовочные файлы находятся в исходниках Apache - httpd-2.0.59-win32-src.zip
Неактивен
Привет. Ты вроде писал что разобрался с созданием модулей минимальных.
Мне вообщем надо создать модуль,в котором была бы функция кантакенации строк, например. И потом надо запустить эту функцию из PHP. Как бы я не совсем понял как должен выглядеть исходный код библиотечки и вообще каким образом можно запускать функции апача из PHP. сли можешь минимально просветить то буду очень благодарен.
Неактивен
Sergey_Minsk написал:
Мне вообщем надо создать модуль,в котором была бы функция кантакенации строк, например. И потом надо запустить эту функцию из PHP. Как бы я не совсем понял как должен выглядеть исходный код библиотечки и вообще каким образом можно запускать функции апача из PHP.
Не совсем понятно, что тебе нужно. Если доп. функции к PHP, то тогда стоит копать в сторону создание расширений к PHP (Хотя копать не надо - все необходимое есть тут http://www.php.net/manual/en/zend.php).
Неактивен
Мне нужно всего навсего создать модуль апча(*.so), в котором была бы любая примитивная функция типо канкатенации строк или прости инверсии строки ну вообщем что угодно. И потом мне необходимо из PHP запустить эту функцию. Вообще такое возможно ? И, если можешь, выложи плз код любого модуля который оставалось бы только скомпились в библиотечку.
Неактивен
P.S. Я на днях установил Apache и как бы пока далеко не в теме... ну это типо оправдываюсь, если вопросы сильно тупые....
Неактивен
Вообщем парни такой вопрос: Может быть такое что в конфигфайл апача добавлена библиотека и её функции запускаются из пхп ? Или нужно в конфиг пхп добавлять подключение этой библиотеки ?
Неактивен