2010-06-19 3 views
6

Ich möchte den leichtesten möglichen HTTP-Server in C machen, der PHP und möglicherweise FastCGI unterstützt, wenn es einen großen Unterschied machen wird.Machen Sie einen Barebones, PHP-fähigen Webserver in C?

Ich bin mir nicht sicher, wie PHP-Unterstützung zu implementieren. Ruft es einfach PHP.exe mit dem Pfad zu einer .php Datei auf und liest die Ausgabe? Was ist mit Dingen wie header() in PHP? Wie werden diese vom Server gehandhabt?

Und eine andere Frage, ist es ideal, separate Threads für jede Anfrage zu verwenden? Ich erwarte keine sehr starke Belastung, aber ich bin mir nicht 100% ig sicher, was den Designaspekt angeht ...

Ich bin immer noch ziemlich neu in C und C++ und das ist eine Lernerfahrung.

Antwort

9

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.

+0

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

+3

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

+0

@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

2

Für eine Lernerfahrung in Bezug auf den HTTP-Code in C geschrieben Sie auch einen Blick in Anspruch nehmen:

http://hping.org/wbox/

2

Um einen eigenen HTTP-Server zu machen, empfehle ich von anderen Völkern Code Inspiration zu bekommen. Der für das node.js-Framework bekannte Programmierer ry hat einen einfachen eleganten Code in dieser Angelegenheit geschrieben.

Schauen Sie sich seine libebb Bibliothek, hat es eine parser mit Raegel erzeugt unter Verwendung der einfachen, aber leistungsfähigen PEG (es basiert auf Zed Shaw Mischlings Parser). Überprüfen Sie auch die example usage. Es ist wirklich sauberer und brauchbarer Code.

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. 

In Bezug auf PHP-Server-Kopplung, ist der einfachste Weg CGI aber wenn Sie abenteuerlich dig in PHP Quellcode unter SAPI (Server API) Module fühlen, um zu sehen, wie es geht.