Как сделать FastCGI в C? - PullRequest
3 голосов
/ 06 ноября 2010

У меня есть веб-сайт, где каждая веб-страница компилируется в двоичный файл (у меня есть 100 веб-страниц, поэтому у меня есть 100 двоичных файлов).Apache .htaccess содержит строку «SetHandler cgi-script», которая инструктирует apache использовать CGI при запросе двоичного файла (веб-страницы).

Как я могу изменить этот сайт, чтобы использовать FastCGI вместо CGI?

Должен ли я просто включить этот заголовок и использовать этот цикл while ( FastCGI.com ) в каждом из 100 двоичных файлов и изменить .htaccess на "SetHandler fastcgi-script"?

#include "fcgi_stdio.h" // instead of stdio.h  
while(FCGI_Accept() >= 0)  

Так как же будет работать FastCGI?Apache будет отправлять веб-страницы, используя один постоянный процесс для всего сайта, или будет один постоянный процесс для каждого из 100 двоичных файлов?

1 Ответ

1 голос
/ 06 ноября 2010

Сценарий FastCGI - это сетевой сервер, который прослушивает соединения в цикле. Веб-сервер перенаправляет запросы на сервер FCGI, который отправляет обратно некоторое динамически генерируемое содержимое - по всему соединению через сокет. Таким образом, сценарий FCGI работает быстрее, чем CGI, поскольку он не создается повторно для каждого запроса.

Я не понимаю, зачем вам 100 бинарных файлов на 100 страниц. Одного скрипта достаточно для генерации контента на 100 страниц, основываясь на каком-то параметре запроса. Сервер FCGI также должен довольно хорошо масштабироваться для нескольких соединений, так как он обычно используется для опроса дескриптора файла сокета. (Посмотрите код реализации, чтобы убедиться в этом).

Чтобы сгенерировать 100 страниц, вам не обязательно нужны 100 операторов if. Рассмотрим этот псевдокод:

hash_table page_generators; // map page types to function objects (or function pointers)
page_generators["login_page"] = handle_login_page_fn; 
page_generators["contact_page"] = handle_contact_page_fn; 
// ... and so on

// request handler
page_type = request.get("page_type");
fn = page_generators[page_type];
if (fn == NULL)
    return "<html><body>Invalid request</body></html>";
else
    return fn(request);
...