2010-06-19 9 views
6

Chcę, aby najlżejszy możliwy serwer HTTP w C, który obsługuje PHP i ewentualnie FastCGI, jeśli zrobi wielką różnicę.Tworzenie serwera webowego w PHP w wersji barebone?

Nie jestem pewien, jak wdrożyć obsługę PHP. Czy po prostu wywołuje PHP.exe ze ścieżką do pliku .php i czyta dane wyjściowe? A co z takimi rzeczami jak header() w PHP? Jak są obsługiwane przez serwer?

I kolejne pytanie, czy idealnym rozwiązaniem jest stosowanie oddzielnych wątków dla każdego żądania? Nie oczekuję bardzo dużego obciążenia, ale nie jestem w 100% pewny co do tego aspektu projektowania ...

Wciąż jestem całkiem nowy w C i C++ i jest to nauka.

Odpowiedz

9

Po pierwsze, pozwól mi powiedzieć, że jeśli celem jest lekki serwer HTTP obsługujący strony PHP, zostało to już zrobione. Spójrz na nginx.

Co do nauki, wybrałeś coś, co jest dość trudne.

Wielowątkowe jest trudne w najlepszych czasach. W C/C++ (cokolwiek z ręcznym przydzielaniem pamięci naprawdę) jest o rząd wielkości trudniejszy.

Do tego dochodzi komunikacja sieciowa. Istnieją dziwactwa, którymi należy się zająć, różne wersje protokołu HTTP (w większości niezwiązane z tym problemem), różne rodzaje nagłówków HTTP, z którymi można sobie poradzić i tak dalej.

Najbardziej intuicyjnym rozwiązaniem tego problemu jest posiadanie procesu, który nasłuchuje na porcie. Kiedy otrzyma żądanie, uruchamia proces, który w razie potrzeby może wywołać proces PHP.

To jednak nie jest skalowane. Pierwszą (oczywistą) optymalizacją jest użycie wątków zamiast procesów i pewnej formy komunikacji międzywymiarowej. Pomaga to, ale do tej pory będzie skalować.

Idź dalej i patrzysz na obsługę asynchronicznych gniazd, która jest dość niska.

Wszystkie te są jednak dość duże projekty.

Czy istnieje jakiś szczególny powód, dla którego robisz to w C/C++? Czy z jakiegoś szczególnego powodu uczysz się jednego lub obu tych języków? Te języki z pewnością mają swoje miejsce, ale coraz częściej stają się niszowymi językami. Języki/platformy zarządzane (śmieci) zostały prawie całkowicie przejęte. Joel twierdzi, że odliczanie śmieci to jedyny ogromny wzrost produktywności w programowaniu w ciągu ostatnich 20 lat i zwykle się z tym zgadzam.

+0

Zrobiłem to samo (bez wsparcia PHP) w Visual Basic 6 lat temu, ale wszystkie rzeczy z Async zostały zajęte już z kontrolą Winsock Microsoftu. Również był to Visual Basic, więc dużo trudniej będzie napisać dobry w C lub C++. (Naprawdę chciałbym pozostać przy C i zrobić to naprawdę dobrze, zanim przejdę do C++). Czy gniazda asynchroniczne są tak złożone, że używają tylko API? Szczerze mówiąc nie mam pojęcia, ponieważ pochodzę z Visual Basic. : P ** Edytuj: ** Dzięki za link do nginx, nigdy nie wiedziałem, że istnieje! (Nadal chcę spróbować napisać jedną jako doświadczenie edukacyjne). –

+3

Nie jestem pewien, czy całkowicie przejąłem. Apache, Lighttpd, Nginx, Cherokee ... wszystkie napisane w C. Istnieją również odpowiednie śmieci zastępujące malloc() zamienniki dla C. Zgadzam się, że to głównie programatory systemów używające C dzisiaj, ale myślę, że nisza jest nieco większa niż opisujesz. –

+0

@guitar C i C++ to naprawdę różne języki z różnymi paradygmatami programowania. Umiejętność posługiwania się jednym nie oznacza ani nie musi pomagać drugiemu. – cletus

2

Aby zrobić własny serwer HTTP, polecam, aby uzyskać inspirację z kodem innych narodów. Programator ry znany ze struktury node.js napisał prosty elegancki kod dotyczący tej kwestii.

sprawdzić jego libebb biblioteki, posiada parser generowane z Raegel stosując proste ale potężne PEG (to na podstawie Zed Shawa kundel parsera). Sprawdź również example usage. To naprawdę czysty i użyteczny kod.

libebb is a lightweight HTTP server library for C. 
It lays the foundation for writing a web server 
by providing the socket juggling and request parsing. 
By implementing the HTTP/1.1 grammar provided 
in RFC2612, libebb understands most most valid HTTP/1.1 
connections (persistent, pipelined, and 
chunked requests included) and rejects invalid or 
malicious requests. libebb supports SSL over HTTP. 

Odnośnie sprzęgła PHP-Server, najprostszym sposobem jest CGI ale jeśli czujesz przygód kopać kodu źródłowego php pod SAPI (Server API) modułów, aby zobaczyć, jak to zrobić.