Непонятно, что вы подразумеваете под «множественными запросами» в вашем вопросе.
Исходя из вашего описания, я предполагаю, что вы ожидаете, что ваше приложение 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.
Надеюсь, это поможет, даже если вы используете другую ОС или язык программирования