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.
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). –
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. –
@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