2010-06-19 13 views
6

Voglio rendere il server HTTP più leggero possibile in C che supporti PHP e possibilmente FastCGI se farà una grande differenza.Fare un barebone, server web abilitato per PHP in C?

Non sono sicuro di come implementare il supporto PHP. Chiama semplicemente PHP.exe con il percorso di un file .php e legge l'output? Che dire di cose come header() in PHP? Come sono gestiti dal server?

E un'altra domanda è l'ideale per utilizzare thread separati per ogni richiesta? Non mi aspetto un carico molto pesante, ma non sono sicuro al 100% sull'aspetto progettuale di questo ...

Sono ancora piuttosto nuovo di C e C++ e questa è un'esperienza di apprendimento.

risposta

9

In primo luogo lasciatemi dire che se l'obiettivo è un server HTTP leggero che serve pagine PHP, questo è già stato fatto. Dai un'occhiata a nginx.

Per quanto riguarda un'esperienza di apprendimento, hai scelto qualcosa che è in realtà abbastanza difficile.

Il multithreading è difficile nei momenti migliori. Su C/C++ (qualsiasi cosa con allocazione manuale della memoria in realtà) è un ordine di grandezza più difficile.

Aggiunto a questo è la comunicazione di rete. Ci sono stranezze da affrontare, diverse versioni di HTTP (per lo più non un problema ora), tutti i tipi di intestazioni HTTP da gestire e così via.

La soluzione più intuitiva a questo problema è avere un processo che ascolti una porta. Quando riceve una richiesta, genera un processo, che può essere eseguito su un processo PHP, se necessario.

Questo tuttavia non scala. La prima (ovvia) ottimizzazione consiste nell'utilizzare thread anziché processi e qualche forma di comunicazione interframa. Mentre questo aiuta, sarà ancora in scala fino ad ora.

Andare oltre e guardare la gestione della presa asincrona, che è piuttosto bassa.

Tutti questi sono tuttavia progetti abbastanza grandi.

C'è qualche ragione particolare per farlo in C/C++? O qualche ragione particolare per cui stai imparando una o entrambe le lingue? Queste lingue hanno certamente il loro posto ma stanno diventando sempre più lingue di nicchia. Le lingue/piattaforme gestite (garbage collection) hanno quasi completamente preso il sopravvento. Joel sostiene che la raccolta dei rifiuti è l'unico aumento enorme della produttività nella programmazione negli ultimi 20 anni e io tendo ad essere d'accordo.

+0

Ho fatto questa stessa cosa (senza il supporto PHP) in Visual Basic 6 anni fa, ma tutte le risorse del socket Async erano già state gestite con il controllo Microsoft Winsock. Inoltre, era Visual Basic, quindi sarà molto più difficile scrivere una buona in C o C++. (Mi piacerebbe molto attenermi a C e diventare davvero bravo prima di andare in C++). I socket asincroni sono davvero complessi utilizzando solo le API? Onestamente non ne ho idea perché vengo da Visual Basic. : P ** Modifica: ** Grazie per il collegamento a nginx, mai saputo che esistesse! (Voglio ancora provare a scriverne uno io stesso come esperienza di apprendimento). –

+3

Non sono così sicuro di essere completamente preso. Apache, Lighttpd, Nginx, Cherokee ... tutto scritto in C. Ci sono anche dei raccoglitori di malloc() per la raccolta di immondizie adatti per C. Sono d'accordo che per lo più solo programmatori di sistemi che usano C oggi, ma penso che la nicchia sia un po 'più grande di quanto tu descrivi. –

+0

@guitar C e C++ sono lingue molto diverse con diversi paradigmi di programmazione. Abilità con uno non implica né necessariamente aiuta con l'altro. – cletus

2

Per un'esperienza di apprendimento per quanto riguarda il codice HTTP scritto in C si può anche dare un'occhiata a:

http://hping.org/wbox/

2

per rendere il proprio server HTTP, mi raccomando per trarre ispirazione dal codice di altri popoli. Il programmatore ry famoso per il framework node.js ha scritto un codice semplice ed elegante su questo argomento.

Partenza sua biblioteca libebb, ha un parser generato con Raegel utilizzando il potente PEG facile (si basa su parser bastardo di Zed Shaw). Controlla anche lo example usage. È un codice veramente pulito e utilizzabile.

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. 

Per quanto riguarda l'accoppiamento PHP-Server, il modo più semplice è CGI ma se si sente scavare avventuroso in codice sorgente PHP sotto SAPI (API Server) moduli per vedere come si fa.

Problemi correlati