Форум ApacheDev

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.

Вы не зашли.

#1 2007-03-07 00:55:25

unknow
Новичок
Зарегистрирован: 2007-03-01
Сообщений: 15
Рейтинг :   

Вот такой модуль, с чего начать

В целях изучения создания модулей для 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) ;

Просьба поправить мои утверждения, если они не полные или вообще неверные.

Неактивен

 

#2 2007-03-07 03:18:08

ApDev
Администратор
Зарегистрирован: 2007-02-14
Сообщений: 106
Рейтинг :   

Re: Вот такой модуль, с чего начать

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

Неактивен

 

#3 2007-03-09 18:47:10

unknow
Новичок
Зарегистрирован: 2007-03-01
Сообщений: 15
Рейтинг :   

Re: Вот такой модуль, с чего начать

Повторюсь немного, я собираюсь ставить 2 фильтра:
входной и выходной.
Теперь новые вопросы:
1. Необходимо подключиться к базе mysql, предварительно, до поступления запросов к серверу.
В каком обработчике это  лучше сделать?
2. Обработка запросов, это анализ и выдача некоторых данных из mysql базы.
Понятное дело, что запросы в базу нужно свести к минимуму.
Обращение в базу это время и ресурсы, но когда есть необходимость в реал-тайм доступе в базу,
а не простого логгирования результатов в базу. Как можно оптимизировать этот процесс?
Насколько будет страдать производительность?
В обработчике входного фильтра я могу проводить достаточно много времени.
Так же задача базы - выдавать клиентам порции информации, есть ли смысл,
читать из базы данных большими блоками по X*размер порциями или же делать для каждого блока один запрос?

Неактивен

 

#4 2007-03-10 15:40:42

ApDev
Администратор
Зарегистрирован: 2007-02-14
Сообщений: 106
Рейтинг :   

Re: Вот такой модуль, с чего начать

unknow написал:

1. Необходимо подключиться к базе mysql, предварительно, до поступления запросов к серверу.
В каком обработчике это  лучше сделать?

Обычно такие вещи делают в post_config_hook, данный обработчик вызывается после запуска сервера и обработки конфигурации.
Прочитайте сперва Проблемы при создании модуля для Apache 2, в этой статье описаны некоторые тонкие моменты разработки модулей.

unknow написал:

2. Обработка запросов, это анализ и выдача некоторых данных из mysql базы.
Понятное дело, что запросы в базу нужно свести к минимуму.
Обращение в базу это время и ресурсы, но когда есть необходимость в реал-тайм доступе в базу,
а не простого логгирования результатов в базу. Как можно оптимизировать этот процесс?
Насколько будет страдать производительность?

Естественно, работа с бд влияет на производительность. Но, в любом случае, работа с базой данных из модуля  Apache происходит быстрее, чем из скрипта.

unknow написал:

В обработчике входного фильтра я могу проводить достаточно много времени.
Так же задача базы - выдавать клиентам порции информации, есть ли смысл,
читать из базы данных большими блоками по X*размер порциями или же делать для каждого блока один запрос?

Все зависит от многих факторов: от количества запросов, от времени выборки данных и др. Если время выборки большое, то есть смысл сделать механизм кеширования данных бд. Попробуйте разные схемы,  сравните их производительность и оставьте лучшую.

Неактивен

 

#5 2007-03-14 16:35:21

unknow
Новичок
Зарегистрирован: 2007-03-01
Сообщений: 15
Рейтинг :   

Re: Вот такой модуль, с чего начать

По поводу входных фильтров:
немного удалось разобраться с кодом на основе модуля 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().

Т.е. с получением самих данных вроде ясно.
А что делать при необходимости изменения их или удаления?


В принципе от же вопрос и для выходных фильтров

Неактивен

 

#6 2007-03-15 14:49:54

ApDev
Администратор
Зарегистрирован: 2007-02-14
Сообщений: 106
Рейтинг :   

Re: Вот такой модуль, с чего начать

Вот тут есть пример работы с данными - Написание входных фильтров Apache.

Неактивен

 

#7 2007-04-04 12:50:21

kvo
Новичок
Зарегистрирован: 2007-04-04
Сообщений: 1
Рейтинг :   

Re: Вот такой модуль, с чего начать

to unknow:
Если не трудно, можешь скинуть мини мануал по созданию и компилированию простейшего модуля с помощью Visual Studio?

Неактивен

 

#8 2007-04-04 13:16:24

ApDev
Администратор
Зарегистрирован: 2007-02-14
Сообщений: 106
Рейтинг :   

Re: Вот такой модуль, с чего начать

unknow опубликовал статью на сайте - Что есть модули Apache2 под Microsoft Windows. В ней он как раз излагает процесс создания модуля с помощью VS.

А в качестве исходного текста модуля рекомендую взять код модуля mod_example.c
Исходник модуля и все необходимые заголовочные файлы находятся в исходниках Apache - httpd-2.0.59-win32-src.zip

Неактивен

 

#9 2007-04-14 11:22:46

Sergey_Minsk
Новичок
Зарегистрирован: 2007-04-14
Сообщений: 4
Рейтинг :   

Re: Вот такой модуль, с чего начать

Привет. Ты вроде писал что разобрался с созданием модулей минимальных.
Мне вообщем надо создать модуль,в котором была бы функция кантакенации строк, например. И потом надо запустить эту функцию из PHP. Как бы я не совсем понял как должен выглядеть исходный код библиотечки и вообще каким образом можно запускать функции апача из PHP. сли можешь минимально просветить то буду очень благодарен.

Неактивен

 

#10 2007-04-14 14:19:18

ApDev
Администратор
Зарегистрирован: 2007-02-14
Сообщений: 106
Рейтинг :   

Re: Вот такой модуль, с чего начать

Sergey_Minsk написал:

Мне вообщем надо создать модуль,в котором была бы функция кантакенации строк, например. И потом надо запустить эту функцию из PHP. Как бы я не совсем понял как должен выглядеть исходный код библиотечки и вообще каким образом можно запускать функции апача из PHP.

Не совсем понятно, что тебе нужно. Если доп. функции к PHP, то тогда стоит копать в сторону создание расширений к PHP (Хотя копать не надо - все необходимое есть тут http://www.php.net/manual/en/zend.php).

Неактивен

 

#11 2007-04-14 16:36:28

Sergey_Minsk
Новичок
Зарегистрирован: 2007-04-14
Сообщений: 4
Рейтинг :   

Re: Вот такой модуль, с чего начать

Мне нужно всего навсего создать модуль апча(*.so), в котором была бы любая примитивная функция типо канкатенации строк или прости инверсии строки ну вообщем что угодно. И потом мне необходимо из PHP запустить эту функцию. Вообще такое возможно ? И, если можешь, выложи плз код любого модуля который оставалось бы только скомпились в библиотечку.

Неактивен

 

#12 2007-04-14 16:37:37

Sergey_Minsk
Новичок
Зарегистрирован: 2007-04-14
Сообщений: 4
Рейтинг :   

Re: Вот такой модуль, с чего начать

P.S. Я на днях установил Apache и как бы пока далеко не в теме... ну это типо оправдываюсь, если вопросы сильно тупые....

Неактивен

 

#13 2007-04-14 16:46:26

ApDev
Администратор
Зарегистрирован: 2007-02-14
Сообщений: 106
Рейтинг :   

Re: Вот такой модуль, с чего начать

Из PHP запускаются только те функции, которые реализованы в расширениях PHP. Это тоже dll.  Apache тут не нужен.

Неактивен

 

#14 2007-04-21 15:26:02

Sergey_Minsk
Новичок
Зарегистрирован: 2007-04-14
Сообщений: 4
Рейтинг :   

Re: Вот такой модуль, с чего начать

Вообщем парни такой вопрос: Может быть такое что в конфигфайл апача добавлена библиотека и её функции запускаются из пхп ? Или нужно в конфиг пхп добавлять подключение этой библиотеки ?

Неактивен

 

Board footer

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson