2010-11-06 2 views
3

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

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

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

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

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

+0

Я виновен в +1, я всегда хотел услышать о CGI в С. –

+1

* Жаль, жаль, жаль * (вместо 100 двоичных файлов, рассмотрим полезный веб-рамки sorts :-) – 2010-11-07 07:26:50

ответ

1

Сценарий 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); 
+0

Нет необходимости в 100 бинарных файлах? Как вы это сделаете? Единый двоичный код с 100, если такие условия? if (strstr (getenv («REQUEST_URI»), «page-name»)) {...} elseif ... Кроме того, один бинарный файл будет очень большим. –

+0

@bobby: не более 100 двоичных файлов. Стоимость запуска и шаблон только во всех этих двоичных файлах намного дороже, чем несколько операторов if. Если вы хотите получить представление о том, почему бы не поместить доступные запросы в C-эквивалент структуры карты, я уверен, что поиск текущего запроса один, который дешевле, чем попадание диска, чтобы найти правильный двоичный файл. –

+0

@bobby О том, как избежать 100 операторов 'if', см. Обновленный ответ. –

Смежные вопросы