2011-08-12 15 views
6

Zasadniczo próbuję dowiedzieć się, jak PHP można wywołać z "serwera WWW".Wywołanie PHP z wirtualnego/niestandardowego "serwera sieciowego"

Przeczytałem dokumentację, ale to nie pomogło.

O ile mogę powiedzieć, istnieją trzy sposoby na wywołanie PHP:

  • poprzez linię poleceń (np php -f "/path/to/script.php")
  • poprzez CGI (??)/Via FastCGI (???)
  • poprzez serwer wWW (np Apache) moduł

Więc zacznijmy CGI. Być może jestem po prostu ślepy, ale specyfikacja nie wspomina o tym, jak na Ziemi serwer sieciowy przekazuje dane (wywołania zwrotne od nagłówków &) do rzeczy implementującej CGI. Sytuacja jest jeszcze gorsza w przypadku FastCGI.

W następnej kolejności mamy moduły specyficzne dla serwera, które, nie wiem nawet, czego szukać, ponieważ wszystkie kontakty kończą się donikąd.

+1

Czy rozważałeś odczytanie kodu? Wszystkie te rzeczy w twoim pytaniu są open source. –

+0

@ Dan * próbuję * to teraz zrobić. Ale z kilku powodów jest to trudne: ** (1) ** Nie mogę znaleźć całego kodu ** (2) ** kod jest w c/C++ ** (3) ** kod jest bardzo stary i/lub niechlujny. – Christian

+0

@ Dan mówi, kto ?? Mogłem to zrobić w Asembler lub ADA, jeśli chciałem (lub FPC, które planuję). – Christian

Odpowiedz

7

Wywołanie skryptu CGI jest całkiem proste. PHP ma kilka osobliwości, ale to w zasadzie wystarczy, aby ustawić listę zmiennych środowiskowych, a następnie zadzwonić do binarnego PHP-CGI:

setenv GATEWAY_INTERFACE="CGI/1.1" 
setenv SCRIPT_FILENAME=/path/to/script.php 
setenv QUERY_STRING="id=123&name=title&parm=333" 
setenv REQUEST_METHOD="GET" 
... 

exec /usr/bin/php-cgi 

większość z nich boilerplate. SCRIPT_FILENAME to sposób przekazywania rzeczywistej nazwy pliku php do interpretera PHP, a nie jako parametru exec. Istotne dla PHP jest również niestandardowa zmienna REDIRECT_STATUS=200.

Do żądania GET potrzebne są tylko zmienne środowiskowe. W przypadku żądania POST wystarczy potokować treść żądania HTTP jako stdin do wykonanego pliku binarnego php-cgi. Zwrócona stdout jest odpowiedzią CGI składającą się z niekompletnego nagłówka HTTP, \ r \ n \ r \ n oraz treści strony.

(Tylko z pamięci.) Może kilka dodatkowych błędów.)

+0

OH. To wyjaśnia wszystko. – Christian

+0

Napotkałem problem, a następnie trzeba jawnie wypełnić zmienne 'PATH_INFO' i' SCRIPT_PATH'. Proszę sprawdzić [moje pytanie] (http://stackoverflow.com/questions/18962960) w celu uzyskania szczegółowych informacji – Andrey

1

FastCGI jest prawdopodobnie najlepszym rozwiązaniem, ponieważ jest to tak mądrze wykorzystane, to daje niezależność języka (można upuścić w Ruby później, na przykład) i to well documented z lotsofexamples.

Możesz napisać własną, Server API, jeśli naprawdę chcesz, ale jest to trudniejsze niż wdrożenie FastCGI i ma kilka wad.

Nie zawracałbym sobie głowy prostym CGI, FastCGI istnieje z jakiegoś powodu.

+0

OK, w jaki sposób serwer internetowy wykonuje IPC z plikiem wykonywalnym PHP? połączenie lokalne (sprzężenie zwrotne)? – Christian

+0

@ Chrześcijanin może być na innym hoście (arbitralne połączenie TCP/IP) lub na drugim końcu rury unixowej. Czy czytasz specyfikację, z którą się łączyłem, jest to całkiem napisane. –

+0

Dam mu dobry wygląd po kilku godzinach snu. Jest już 2:30:/ – Christian

Powiązane problemy