2010-10-27 12 views
5

Aktualizacja:Jak przekazać dane POST do PHP-CGI?

W przypływie desperacji, zrobiłem następujące w powłoce:

REDIRECT_STATUS=true 
SCRIPT_FILENAME=/var/www/... 
REQUEST_METHOD=POST 
GATEWAY_INTERFACE=CGI/1.1 
export REDIRECT_STATUS 
export SCRIPT_FILENAME 
export REQUEST_METHOD 
export GATEWAY_INTERFACE 
echo "test=1" | php-cgi 

... i nadal nie ma $_POST zmienne są wyświetlane na wyjściu to:

<?php var_dump($_POST); ?> 

próbuję stworzyć mały serwer WWW, który łączy się z php-cgi plik binarny. Jednak sprawy nie idą tak dobrze. Binarny plik php-cgi poprawnie obsługuje żądania GET. Jeśli chodzi o żądania POST, tablica $_POST jest pusta, nawet gdy rzeczy otrzymują POSTed.

Sprawdziłem, czy nagłówki HTTP podawane do pliku binarnego php-cgi rzeczywiście zawierają dane POST i nagłówek Content-type: application/x-www-form-urlencoded.

Co może być zachowaniem pliku binarnego php-cgi, widząc, że w zapytaniu znajdują się dane POST?


Robię postępy, jakie wykopano kilka rzeczy z PHP source code:

  • /sapi/cgi/cgi_main.c:

    468: static int sapi_cgi_read_post(char *buffer, uint count_bytes TSRMLS_DC)

(. Nie mam pojęcia, gdzie ta funkcja jest wywoływana z)


Po przeczytaniu odpowiedź poniżej, próbowałem:

<?php 

var_dump($HTTP_RAW_POST_DATA); 

?> 

... co dało wynik:

NULL 

... wskazując, że działa tutaj coś jeszcze dziwniejszego.


jestem coraz bliżej ... Znalazłem tę funkcję w /main/php_content_types.c:

SAPI_API SAPI_POST_READER_FUNC (php_default_post_reader)

... i wydaje się, że kod, który przetwarza żądania POST.

+0

Czas na wybranie źródła PHP: P –

+1

Nie mam odpowiedzi, ale dane POST powinny przychodzić za pośrednictwem standardowego wejścia. –

+0

Czy twój serwer sieciowy poprawnie implementuje specyfikację CGI 1.1? – joschi

Odpowiedz

4

I wreszcie zorientowaliśmy się:

Widocznie zmienna Środowisko CONTENT_LENGTH musi być ustawiony.

dodania:

CONTENT_LENGTH=6 
export CONTENT_LENGTH 

na moim przykładzie powyżej powoduje, że prawidłowo działa!

+0

Powinieneś również prawdopodobnie ustawić Content-type na minimum - w zasadzie wszystkie te rzeczy HTTP, które próbujesz do stdin w poprzedniej wersji skryptu powłoki należy ustawić jako zmienną środowiskową przed uruchomieniem CGI. O, i powinieneś oznaczyć tę odpowiedź jako "zaakceptowaną" :) – TML

+0

@TML: True - Dodałem "Content-type", teraz działa. Nie mogę tego zaakceptować do 24 godzin po opublikowaniu. (IIRC) –

0

Spróbuj sprawdzić zmienną $ HTTP_RAW_POST_DATA.

http://php.net/manual/en/reserved.variables.httprawpostdata.php

+0

Podchodzi jako 'NULL'. Dlaczego to robi? –

+0

Ponieważ $ HTTP_RAW_POST_DATA jest okropnym rozwiązaniem - file_get_contents ("php: // input") jest lepsze, ale nie będzie działać z wieloczęściowymi/zakodowanymi danymi. – TML

+0

Więcej informacji na temat różnic można znaleźć na stronie http://us3.php.net/manual/en/wrappers.php.php. – TML

2

Wspomniał Pan, że system działał poprawnie. należy ustawić tylko długość treści dla testów POST

Również to może pomóc, jest to specyfikacja CGI/1.1. To pokazuje, jakie zmienne środowiskowe potrzebne do ustawienia:

http://graphcomp.com/info/specs/cgi11.html i to lib.ru/WEBMASTER/cgi1_1spec/interface.html

Jakie były minimalne zmienne środowiskowe trzeba było dostać GET działa?

+0

SCRIPT_FILENAME, REQUEST_METHOD i REDIRECT_STATUS. –

+0

REDIRECT_STATUS nie jest wymagany, jeśli masz cgi.force_redirect = 0 w swoim php.ini. Próbowałem go dodać i SCRIPT_FILENAME i nadal nie będzie działać –