2011-01-21 7 views
9

Sto sviluppando un piccolo server web in C# come parte di un progetto più ampio (la natura del progetto mi impedisce di utilizzare qualcosa come apache nginx, che sarebbe la mia prima scelta).Utilizzo di applicazioni FastCGI dall'interno di un'app C#

Il server Web ha bisogno di PHP per elaborare alcune delle richieste che riceve.

Al momento sto eseguendo php come cgi utilizzando System.Diagnostics.Process e piping dati da e verso. Funziona ma è piuttosto lento (presumibilmente dal sovraccarico di PHP che inizia a partire da zero, è il problema principale). Quindi voglio provare a utilizzare FastCGI.

Ho esaminato le specifiche FastCGI e ho iniziato a implementare un sottoinsieme di base, ma non ho avuto molta fortuna. La maggior parte degli esempi che ho visto sono state librerie per lo sviluppo di moduli FastCGI, non per invocarli, quindi ho avuto pochissimo da usare come riferimento.

Qualcuno ha avuto esperienza su questo sotto .NET, o potrebbe raccomandare qualche risorsa utile per questo tipo di progetto?

+1

ho incontrato lo stesso problema. Un'opzione alternativa sarebbe usare Phalanger per eseguire il PHP. Si perde la dipendenza su php-cli.exe perché ha il proprio compilatore. – Muis

risposta

2

Ho anche dovuto fare qualcosa di simile (durante un periodo di transizione) e ho usato MiniHttpd: an HTTP web server library. Quello che dovevo fare era leggermente diverso in quanto non avevo bisogno di un httpd piuttosto di un modo per eseguire PHP da un'applicazione C#.

In pratica fa riferimento al codice non gestito direttamente dalla DLL che utilizza il file su disco (consultare PhpAppDirectory.cs).

+0

Sembra che potrebbe funzionare bene. Sembra MiniHttpd utilizza php5ts.dll che dovrebbe essere caricato solo una volta. – Twelve47

0

ho dovuto fare la stessa cosa è davvero facile da fare,

Se basta eseguire l'exe php-cgi con cmd e un file di prova php lo vedrete uscita

C:\Program Files (x86)\PHP>php-cgi c:/xampp/php/test.php 
X-Powered-By: PHP/5.3.6 
location test.php 
Content-type: text/html 

relocated 

Questo è il mio esempio sopra tutto quello che devi fare è chiamare php-cgi e leggere nella risposta

La prima interruzione doppia è dove le intestazioni si fermano e il tuo output si verifica quindi se hai l'output della console in una variabile EG public string phpOutput allora hai solo bisogno di una regex per dividerlo \ N \ n ma mettere il conteggio 1 in modo che divide solo sulla prima occorrenza di \ n \ n,

es

Regex.Split(phpOutput, "(\r\n){2,}|\n{2,}|\r{2,}", RegexOptions.ExplicitCapture); 
+0

Sta usando il CGI classico che è relativamente lento perché deve creare un nuovo processo e analizzare php.ini per ogni richiesta. Invece di creare un nuovo processo per ogni richiesta, FastCGI utilizza processi persistenti per gestire una serie di richieste. – Twelve47

+0

questo sarebbe lo stesso di IIS, basta dire php per forzare fastcgi nel php.ini http://technet.microsoft.com/en-us/library/dd239230(WS.10).aspx –