Zunächst möchte ich sagen, dass, wenn das Ziel ein leichter HTTP-Server ist, der PHP-Seiten bedient, wurde dies bereits getan. Schauen Sie sich nginx an.
Für eine Lernerfahrung haben Sie etwas ausgewählt, das eigentlich ziemlich hart ist.
Multithread ist in den besten Zeiten hart. Auf C/C++ (alles mit manueller Speicherzuweisung wirklich) ist es eine Größenordnung schwerer.
Hinzu kommt Netzwerkkommunikation. Es gibt Quirks, mit denen man sich auseinandersetzen muss, verschiedene Versionen von HTTP (meistens kein Problem mehr), alle Arten von HTTP-Headern, mit denen man sich befassen muss und so weiter.
Die intuitivste Lösung für dieses Problem ist ein Prozess, der auf einen Port hört. Wenn er eine Anfrage erhält, erzeugt er einen Prozess, der bei Bedarf einen PHP-Prozess ausführen kann.
Dies ist jedoch nicht skalierbar. Die erste (offensichtliche) Optimierung besteht in der Verwendung von Threads anstelle von Prozessen und einer Form der Interthread-Kommunikation. Während dies hilft, wird es immer noch nur skalieren.
Gehen Sie darüber hinaus und Sie betrachten asynchrone Socket-Handhabung, die ziemlich niedrigen Pegel ist.
Alle diese sind jedoch ziemlich große Projekte.
Gibt es einen bestimmten Grund, warum Sie dies in C/C++ tun? Oder aus einem bestimmten Grund, dass Sie eine oder beide dieser Sprachen lernen? Diese Sprachen haben sicherlich ihren Platz, aber sie werden immer mehr zu Nischensprachen. Verwaltete (Garbage Collection) Sprachen/Plattformen haben fast vollständig übernommen. Joel argumentiert, dass die Garbage Collection in den letzten 20 Jahren die einzige enorme Produktivitätssteigerung bei der Programmierung ist und ich stimme dem zu.
Ich habe die gleiche Sache (ohne PHP-Unterstützung) in Visual Basic vor 6 Jahren getan, aber alle Async-Socket Zeug wurde bereits mit Microsofts Winsock-Steuerelement erledigt. Außerdem war es Visual Basic, so dass es viel schwieriger wird, ein gutes in C oder C++ zu schreiben. (Ich würde wirklich gerne bei C bleiben und wirklich gut darin werden, bevor ich nach C++ gehe). Sind asynchrone Sockets wirklich so komplex mit nur APIs? Ich habe ehrlich gesagt keine Ahnung, weil ich von Visual Basic komme. : P ** Bearbeiten: ** Danke für den Link zu Nginx, wusste nie, dass es existiert! (Ich möchte immer noch versuchen, eine selbst als Lernerfahrung zu schreiben). –
Ich bin mir nicht sicher, ob ich komplett übernommen bin. Apache, Lighttpd, Nginx, Cherokee ... alle in C geschrieben. Es gibt auch geeignete Müllsammeln malloc() Ersatz für C. Ich stimme zu, dass seine meist nur System-Programmierer, die C heute verwenden, aber ich denke, die Nische ist ein bisschen größer als du beschreibst. –
@guitar C und C++ sind wirklich verschiedene Sprachen mit unterschiedlichen Programmierparadigmen. Geschick mit einem bedeutet nicht, dass es nicht notwendigerweise auch mit dem anderen hilft. – cletus