FastCGI kurs / tutorial / cokolwiek do nauki

To że znasz dany język programowania jest żadnym argumentem by go wykorzystywać wszędzie.

Źródeł nie ma bo nikt nie pisze stron internetowych w C++, no chyba że w asp.net ale to jest już jest całe środowisko programistyczne.

PHP jest modułem do nginxa czy apache więc po co masz robić coś co już jest. Wadą tego co chcesz zrobić będzie to że przy każdej zmianie będziesz musiał nie dość że kompilować projekt (plugin) to go wgrywać na serwer i restartować serwer www by zaktualizować plugin. Chyba że w serwerze jest jakiś tryb developerski który aktualizuje w locie pluginy.

1.5k linijek kodu to jest nic taka prawda. Mój mały projekt ma trochę ponad 11k.

PHP ma składnię bardzo podobną do C++, nie ma w nim wielu rzeczy między innymi wskaźników czy przeciążania metod. Jest słabo typowany. Ogólnie jest prostszy od C++. Zastanów się czy lepiej uczyć się podstaw związanych z zasadą działania strony internetowej, z komunikacją strona/serwer, poznawać HTTP na C++ który nie ma do tego praktycznie żadnych gotowców, czy na języku który został do tego wręcz stworzony. PHP to badziew zgadzam się, sam go nie lubię, a piszę w nim bo jest “tańszy” przez co wielu klientów woli stronę w php. Zrób najpierw coś w sposób łatwy, poznaj to a dopiero potem zbieraj się za to w sposób bardziej ambitny. Chcesz się uczyć czy się zaorać w kodzie? Jeśli uczyć zrób to w sposób taki w który się czegoś nauczysz, a nie gdzie będziesz musiał odraz wgryźć się w naprawdę zaawansowane i profesjonalne zagadnienia.

Od razu uczyłeś się jeździć samochodem, czy najpierw nauczyłeś się raczkować, chodzić, biegać, jeździć rowerem? Jeśli ze szpitala do domu wracałeś prowadząc auto to spoko dobrą drogę wybrałeś.

Zapomniałem o jednym, znasz się na wielowątkowości i współbieżności? Bo skoro zabierasz się za serwer to te pojęcia nie są ci obce i na pewno znasz się na współdzieleniu danych przez wątki oraz synchronizacji operacji.

EDIT:

Bez urazy, ale zastanów się nad tym jeszcze bo mój prosty plugin do wordpressa ma więcej linijek kodu niż twój projekt.

Nie do końca rozumiem stronę w którą idzie ta dyskusja. Czy nie jest najprostszym rozwiązaniem zachowanie tego co masz w C++, a napisanie jedynie końcówki webowej (web service), w PHP, albo czymkolwiek innym co jest do tego stworzone?

Wewnętrznie może to wołać twoją aplikację w C++, chodzi jedynie o to, żeby sama końcówka była stworzona w technologii do tego powszechnie używanej.

Nie znam się na PHP, ale masz tam polecenie execdo wywoływania innych programów i łatwą możliwość tworzenia web serviców, np. tuprzykład jak zwrócić czysty XML.

Wiem, chcę go wykorzystać, ponieważ jest szybki.

Nie chodzi mi o C++. Jeżeli by się znalazły to byłbym szczęśliwy. Chciałem źródła ogólnie o tworzeniu serwisów.

Wiem, że to mało. To tylko przykład, mający zobrazować ci, w jaki sposób się uczę.

NginX’a można aktualizować “w locie”. Nie wiem jak to się ma do własnych modułów, ale tak, czy inaczej nie sądzę, żeby był to taki problem. NginX jest lekki i szybko się kompiluje, wgrywa i restartuje. Nie sądzę, żeby wszystko trwało więcej niż 5 minut, aktualizował przecież nie będę co chwilę. 

PHP używa się jako skryptów CGI. Język używane w tych skryptach jest właściwie dowolny i równie dobrze w zamiast niego mógłbym używać C++. CGI jest jednak mało wydajne, więc chciałem wykorzystać FastCGI, ale skoro mówicie mi, że to przestarzałe, stwierdziłem, że mogę zrealizować to jako moduł NginX’a. Na razie o tym czytam i jeżeli uznam to za dobry sposób, to go wykorzystam.

Przerabiałem to jak na razie w teorii i mam już rozplanowane. 

 

@kowgli Na tę chwilę łącznikiem ma być moduł NginX’a. Może PHP jako łącznik to sensowne rozwiązanie na początek, ale na razie spróbuję z modułem.

W internecie dużo osób się wypowiada mając mgliste pojęcie o temacie dyskusji, przyzwyczajaj się. FastCGI to jest protokół komunikacyjny i to wszystko. Twórcy niepotrzebnie w nazwie dali człon cgi przez to część osób kojarzy go z tradycyjnym CGI. W tej chwili większość hostingów oferujących PHP korzysta z FastCGI, dzięki temu interpreter PHP może być uruchomiony na innym użytkowniku niż serwer WWW i każdy użytkownik serwera może mieć swój własny interpreter na swoim własnym uidzie. Wywalenie takiego interpretera nie spowoduje crashu serwera. A jeśli się znajdzie użytkownik zbyt mocno zajeżdzający serwer to można mu cichutko ustawić większy nice dla procesu PHP.

Pytałeś tu już w innym wątku o CGI i postgresa ale nie miałem czasu odpowiedzieć bo i tydzień cieżki, pokaże ci przykład prostego programu FastCGI, niech to będzie swinka z licznikiem odwiedzin:

#include <iostream>
#include <fcgiapp.h>

int main()
{
	int init = FCGX_Init();
	
	if( init != 0 )
	{
		std::cerr << "nie moge zainicjowac obslugi FastCGI" << std::endl;
		return 1;
	}

	int sock = FCGX_OpenSocket("/var/swinki/swiniak.sock", 100);
	
	if( sock == -1 )
	{
		std::cerr << "problem z utworzeniem socketu fastcgi" << std::endl;
		return 2;
	}

	FCGX_Request req;
	init = FCGX_InitRequest(&req, sock, FCGI_FAIL_ACCEPT_ON_INTR);

	if( init != 0 )
	{
		std::cerr << "FCGX_InitRequest zwrocilo blad" << std::endl;
		return 3;
	}

	unsigned int counter = 0;

	while( FCGX_Accept_r(&req) != - 1 )
	{
		FCGX_PutS("Content-Type: text/html\r\n\r\n", req.out);
		FCGX_PutS("\r\n", req.out);
		FCGX_FPrintF(req.out, "Swinka wynosi: %u", counter);
		counter += 1;
	}

return 0;
}

Ustawiasz katalog w którym będzie socket komunikacyjny (zauważ że wykonuje to jako administrator):

/home/tomek# mkdir /var/swinki/

nadajesz mu uprawnienia do zapisu dla swojego użytkownika pod którym będzie uruchomiony program:

/home/tomek# chown tomek:wheel /var/swinki/

kompilujesz program:

/home/tomek$ clang++ -o swinka -I/usr/local/include -L/usr/local/lib swinka.cpp -l fcgi

i uruchamiasz:

./swinka &

Program utworzył socket więc socketowi nadajesz uprawnienia do zapisu dla serwera www:

/home/tomek# chown tomek:www /var/swinki/swiniak.sock
/home/tomek# chmod 770 /var/swinki/swiniak.sock

Tu jako grupę użyłem www na której działa mój serwer w twoim przypadku może oczywiście być inna. Teraz konfigurujesz serwer www (u mnie lighttpd) aby komunikował się poprzez protokół FastCGI z twoją aplikacją:

$HTTP["host"] =~ "^(www\.)?swinka\.ttmath\.org" {
fastcgi.server = (
             "" =>
                ((
                  "socket" => "/var/swinki/swiniak.sock",
                  "check-local" => "disable",
                  "mode" => "responder",
                ))
                 )
}

I klikając tutaj przekonujesz się ile świnka zliczyła odwiedzin:

http://swinka.ttmath.org/

To jest tak w wielkim uproszczeniu, prawdziwa aplikacja którą stworzysz będzie musiała:

  • umieć parsować wejście od klienta: parsowanie URI oraz formularze application/x-www-form-urlencoded oraz multipart/form-data jeśli chcesz przesyłać pliki od klienta

  • dodać obsługę wyjścia, jakiś system szablonów html

  • dodać abstrakcję dla dostępu do bazy danych, no chyba że chcesz sqla kleić z palca

 

FastCGI powstawał w czasach gdzie głównym protokołem komunikacyjnym było CGI, twórcy bardzo chcieli aby zastąpił on CGI przez to i w nazwie dodali cgi i w samym api znajdziesz dużo rzeczy które mają niby zastąpić cgi. Przeglądając fcgi_stdio.h zobaczysz że przy pomocy makr zmieniają zachowanie standardowych rzeczy np:

#define	stdin FCGI_stdin

może się to wydawać wygodne na początku ale im bardziej w las tym gorzej. Dlatego w moim przykładzie pokazałem ci użycie bezpośrednio api które jest zdefiniowane w fcgiapp.h, plik ten znajdziesz w:

/home/tomek$ pkg info | grep -i fastcgi
fcgi-devkit-2.4.0_5 FastCGI Development Kit
spawn-fcgi-1.6.4_2 Spawns fastcgi applications
/home/tomek$ pkg info -l fcgi-devkit-2.4.0_5 | grep fcgiapp
        /usr/local/include/fcgiapp.h

otwórz go w edytorze tekstu i zobaczysz prosty ładnie udokumentowany zbiór funkcji języka C. A reszta należy do ciebie.

 

@tomms Wielkie dzięki. Pytałem o PostgreSQL i CGI, bo jeszcze nie wiedziałem o FastCGI. Ale jak to w końcu z tym jest? Przestarzałe, nie przestarzałe, czego się teraz używa, co jest dobre? Na razie wziąłem się za naukę podstawowych protokołów, więc mam jeszcze czas na decyzje. Poza tym, co sądzisz o pisaniu własnego serwera http?