2010-10-27 3 views
5

Update:Wie übergeben Sie POST-Daten an die PHP-CGI?

In einem Anfall von Verzweiflung habe ich folgend in einer Schale:

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 

... und noch keine $_POST Variablen zeigen in der Ausgabe von auf dem Punkt:

<?php var_dump($_POST); ?> 

ich versuche, einen kleinen Webserver zu erstellen, die mit demSchnittstellenbinär. Allerdings läuft es nicht so gut. Die php-cgi-Binärdatei verarbeitet GET-Anforderungen korrekt. Wenn es um POST-Anfragen geht, ist das Array $_POST leer, selbst wenn Dinge POST werden.

Ich habe überprüft, die HTTP-Header in die php-cgi Binärdatei und sie sind in der Tat enthalten die POST-Daten und die Content-type: application/x-www-form-urlencoded-Header.

Was könnte die Binärdatei php-cgi davon abhalten zu sehen, dass POST-Daten in der Anfrage enthalten sind?


ich Fortschritte machen, ich habe ein paar Sachen aus dem PHP source code ausgegraben:

  • /sapi/cgi/cgi_main.c:

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

(. Ich habe keine Ahnung, wo diese Funktion aufgerufen wird)


Nach der Antwort unten zu lesen, habe ich versucht:

<?php 

var_dump($HTTP_RAW_POST_DATA); 

?> 

..., die die Ausgabe ergab:

NULL 

... was darauf hindeutet, dass hier noch etwas Fremder am Werk ist.


Ich bin immer näher ... Ich fand diese Funktion in /main/php_content_types.c:

SAPI_API SAPI_POST_READER_FUNC (php_default_post_reader)

... und es scheint, den Code zu sein, dass verarbeitet POST-Anfragen.

+0

Zeit zur Auswahl durch die PHP-Quelle: P –

+1

Ich habe keine Antwort, aber POST-Daten sollten über STDIN kommen. –

+0

Implementiert Ihr Webserver die CGI 1.1-Spezifikation korrekt? – joschi

Antwort

4

ich schließlich dachte es aus:

Anscheinend ist der CONTENT_LENGTH Umgebungsvariable gesetzt werden muss.

Hinzufügen:

CONTENT_LENGTH=6 
export CONTENT_LENGTH 

meinem obigen Beispiel bewirkt, dass es richtig funktioniert!

+0

Sie sollten auch wahrscheinlich Content-Typ auf ein Minimum setzen - im Grunde alle diese HTTP-Zeug, die Sie versuchen, zu pipen in stdin in der vorherigen Version des Shell-Skripts muss als Umgebungsvariable festgelegt werden, bevor das CGI gestartet wird. Oh, und Sie sollten diese Antwort als "akzeptiert" markieren :) – TML

+0

@TML: True - Ich habe 'Content-Typ' jetzt hinzugefügt, dass es funktioniert. Ich kann das erst 24 Stunden nach der Veröffentlichung akzeptieren. (IIRC) –

0

Versuchen Sie, die Variable $ HTTP_RAW_POST_DATA zu überprüfen.

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

+0

Es erscheint als 'NULL'. Warum macht es das? –

+0

Weil $ HTTP_RAW_POST_DATA eine schreckliche Lösung ist - file_get_contents ('php: // input') ist besser, funktioniert aber nicht mit multipart/form-data codierten Daten. – TML

+0

Lesen Sie mehr über die Unterschiede unter http://us3.php.net/manual/en/wrappers.php.php – TML

2

Sie erwähnten, dass Ihr System GETs gut gemacht hat. Inhalt Länge muss nur für POSTs

Auch dies kann helfen, es ist die CGI/1.1-Spezifikation. Es zeigt, was Umgebungsvariablen festgelegt werden müssen:

http://graphcomp.com/info/specs/cgi11.html und diese lib.ru/WEBMASTER/cgi1_1spec/interface.html

Was die Mindestumgebungsvariablen waren Sie bekommen Anfragen benötigt zum Laufen zu bringen?

+0

SCRIPT_FILENAME, REQUEST_METHOD und REDIRECT_STATUS. –

+0

REDIRECT_STATUS ist nicht erforderlich, wenn Sie cgi.force_redirect = 0 in Ihrer php.ini haben. Ich habe versucht, es hinzuzufügen und SCRIPT_FILENAME und es funktioniert immer noch nicht –