FastCGI Обработка нескольких запросов без библиотеки - PullRequest
0 голосов
/ 14 января 2019

Я хотел бы знать, как я должен обрабатывать несколько запросов с одним экземпляром программы, то есть я имею в виду, что программа fcgi должна продолжать работать после ответа на один запрос, проблема в том, как мне узнать, что данные текущего запроса внутри переменных среды не совпадают с данными последнего запроса.

Моя идея состоит в том, чтобы использовать setenv для установки переменных окружения на NULL после их анализа, поэтому, когда они не равны NULL, это означает, что сервер установил их в значения нового запроса, но я не уверен, что так и должно быть.

Я знаю, что есть библиотеки, которые обрабатывают эти вещи, и что безопаснее их использовать, но сейчас моя цель - просто узнать, как fcgi работает за библиотеками

1 Ответ

0 голосов
/ 15 января 2019

Непонятно, что вы подразумеваете под «множественными запросами» в вашем вопросе.

Исходя из вашего описания, я предполагаю, что вы ожидаете, что ваше приложение FastCgi все еще живо после обработки первого запроса и может обработать другой запрос. Но такова природа FastCgi: одна программа / служба работает в «бесконечном цикле» и обрабатывает все входящие запросы. Дизайн FastCGI гарантирует, что объект Request (включая все переменные окружения) установлен правильно.

Старый CGI работает противоположным образом: новый процесс (т.е. экземпляр) программы CGI создается при каждом запросе.

Весьма вероятно, что вы заинтересованы в параллельных запросах. Но это все еще возможно. К сожалению, вы не упомянули ни тип сервера, ни язык программирования, ни ОС, с которыми работаете.

Действительно легко найти примеры для обработки одновременных запросов в системах Unix на C / C ++.

Вы упомянули, что вам не хотелось бы использовать какие-либо библиотеки, но я считаю, что вы должны использовать хотя бы одну, которая реализует интерфейс FastCGI. Наиболее часто используемый fcgiapp от Open Market. Обработка одновременных запросов достигается с помощью многопоточной техники, которая называется Locks. Я «парень с Windows», так что это мой пример для WINAPI и C:

#define THREAD_COUNT 20
#define FAST_CGI_SOCKET ":9345"

#include <locale.h>
#include "fcgiapp.h"

CRITICAL_SECTION accept_mutex;

DWORD WINAPI requestHandler()
{
    int code;
    FCGX_Request request;
    FCGX_InitRequest(&request, 0, 0);

    for (;;)
    {
        EnterCriticalSection(&accept_mutex);
        code = FCGX_Accept_r(&request);
        LeaveCriticalSection(&accept_mutex);    

        if (code < 0) break;

        // TODO handle request

        FCGX_Finish_r(&request);
    }

    return 0;
}

void initFastCgi() {
    FCGX_Init();
    FCGX_OpenSocket(FAST_CGI_SOCKET, SOMAXCONN);
}

void startThreadsAndWait() {
    int i;
    HANDLE threads[THREAD_COUNT];

    InitializeCriticalSection(&accept_mutex);    

    for (i = 0; i < THREAD_COUNT; i++) {
        threads[i] = CreateThread(NULL, 0, &requestHandler, NULL, 0, NULL);
    }

    for (i = 0; i < THREAD_COUNT; i++) {
        WaitForSingleObject(threads[i], INFINITE);
    }

    for (i = 0; i < THREAD_COUNT; i++) {
        CloseHandle(threads[i]);
    }
}

void appStart() {
    setlocale(LC_ALL, "en_US.utf8");

    initFastCgi();
}

void freeResources() {

}

void appFinish() {
    freeResources();
}

int main(void)
{
    appStart();
    startThreadsAndWait();
    appFinish();

    return 0;
}

Вся магия вокруг accept_mutex.

Надеюсь, это поможет, даже если вы используете другую ОС или язык программирования

...