2011-01-21 16 views
9

Zajmuję się tworzeniem małego serwera WWW w języku C# jako części większego projektu (natura projektu uniemożliwia mi użycie czegoś takiego jak apache nginx, który byłby moim pierwszym wyborem).Używanie aplikacji FastCGI z poziomu aplikacji C#

Serwer sieciowy potrzebuje PHP do przetworzenia niektórych żądań, które otrzymuje.

W tej chwili używam php jako cgi przy użyciu System.Diagnostics.Process i piping danych do iz. Działa to, ale jest dość powolny (prawdopodobnie od początku z PHP zaczyna się od zera, jest głównym problemem). Dlatego chcę spróbować użyć FastCGI zamiast tego.

Przyjrzałem się specyfikacji FastCGI i zacząłem wdrażać podstawowy podzbiór, ale nie mam szczęścia. Większość przykładów, które widziałem, to biblioteki do opracowywania modułów FastCGI, a nie do ich wywoływania, więc nie miałem zbyt wiele do wykorzystania jako odniesienie.

Czy ktoś ma jakieś doświadczenie w robieniu tego w .NET, czy może polecić jakieś użyteczne zasoby dla tego rodzaju projektu?

+1

Mam biegać na ten sam problem. Alternatywną opcją byłoby użycie Phalanger do wykonania PHP. Stracisz zależność od php-cli.exe, ponieważ ma ona własny kompilator. – Muis

Odpowiedz

2

Musiałem również zrobić coś podobnego (podczas okresu przejściowego) i użyć MiniHttpd: an HTTP web server library. To, co musiałem zrobić, było nieco inne, ponieważ nie potrzebowałem httpd, a raczej sposobu na wykonywanie PHP z aplikacji C#.

W zasadzie odwołuje się do niezarządzanego kodu prosto z biblioteki DLL przy użyciu pliku na dysku (zobacz PhpAppDirectory.cs).

+0

Wygląda na to, że może dobrze działać. Wydaje się, że MiniHttpd używa php5ts.dll, który powinien być ładowany tylko raz. – Twelve47

0

musiałem zrobić to samo jest naprawdę łatwe do zrobienia,

Jeśli po prostu uruchom plik php-cgi z cmd i plik testowy php będzie zobaczyć to wyjście

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 

To jest mój przykład przede wszystkim, co musisz zrobić, to zadzwonić do php-cgi i przeczytać w odpowiedzi

Pierwsza podwójna przerwa to miejsce, w którym nagłówki się zatrzymują, a twoje wyjście ma miejsce, więc jeśli masz wyjście konsoli w zmiennej EG public string phpOutput, to potrzebujesz tylko wyrażeń regularnych, aby go podzielić \ N \ n ale ustawić licznik na 1 więc to dzieli tylko od pierwszego wystąpienia \ n \ n,

np

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

Używa to klasycznego CGI, który jest stosunkowo wolny, ponieważ musi utworzyć nowy proces i przeanalizować php.ini dla każdego żądania. Zamiast tworzyć nowy proces dla każdego żądania, FastCGI używa ciągłych procesów do obsługi szeregu żądań. – Twelve47

+0

To byłoby to samo, co IIS, który po prostu powiedziałeś php wymusić fastcgi w php.ini http://technet.microsoft.com/en-us/library/dd239230(WS.10).aspx –

Powiązane problemy