2010-10-27 4 views
5

Mise à jour:Comment transmettre des données POST au PHP-CGI?

Dans une forme de désespoir, je l'ai fait ce qui suit dans une coquille:

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 

... et toujours pas de variables $_POST montrent des signes dans la sortie de celle-ci:

<?php var_dump($_POST); ?> 

Je suis en train de créer un petit serveur web qui interface avec le php-cgi binaire. Cependant, les choses ne vont pas si bien. Le binaire php-cgi gère correctement les requêtes GET. Lorsqu'il s'agit de requêtes POST, le tableau $_POST est vide, même lorsque les éléments sont POSTés.

J'ai vérifié les en-têtes HTTP qui sont introduits dans le binaire php-cgi et ils incluent en effet les données POST et l'en-tête Content-type: application/x-www-form-urlencoded.

Qu'est-ce qui pourrait empêcher le binaire php-cgi de voir que les données POST sont incluses dans la requête?


Je fais des progrès, je l'ai déterré quelques trucs du PHP source code:

  • /sapi/cgi/cgi_main.c:

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

(. Je ne sais pas où cette fonction est appelée à partir)


Après avoir lu la réponse ci-dessous, j'ai essayé:

<?php 

var_dump($HTTP_RAW_POST_DATA); 

?> 

... qui a abouti à la sortie:

NULL 

... indiquant que quelque chose d'encore plus étrange est à l'œuvre ici.


Je reçois plus ... Je trouve cette fonction dans /main/php_content_types.c:

SAPI_API SAPI_POST_READER_FUNC (php_default_post_reader)

... et il semble être le code traite les requêtes POST.

+0

Il est temps de choisir la source PHP: P –

+1

Je n'ai pas de réponse, mais les données POST devraient arriver via stdin. –

+0

Votre serveur Web met-il correctement en œuvre la spécification CGI 1.1? – joschi

Répondre

4

Je enfin figured it out:

Apparemment, la variable d'environnement CONTENT_LENGTH doit être définie.

Ajout:

CONTENT_LENGTH=6 
export CONTENT_LENGTH 

à mon exemple cause au-dessus fonctionne correctement!

+0

Vous devriez également définir le type de contenu au minimum - en gros, tout ce que vous essayez de faire dans stdin dans votre version précédente du script shell doit être défini en tant que variable d'environnement avant le démarrage du CGI. Oh, et vous devriez marquer cette réponse comme "acceptée" :) – TML

+0

@TML: True - J'ai ajouté 'Content-type' maintenant que cela fonctionne. Je ne peux pas accepter cela jusqu'à 24 heures après l'avoir posté. (IIRC) –

0

Essayez de vérifier la variable $ HTTP_RAW_POST_DATA.

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

+0

Ça arrive comme 'NULL'. Pourquoi fait-il ça? –

+0

Parce que $ HTTP_RAW_POST_DATA est une solution terrible - file_get_contents ('php: // input') est meilleur, mais ne fonctionnera pas avec les données codées multipart/form-data. – TML

+0

En savoir plus sur les différences à l'adresse http://us3.php.net/manual/fr/wrappers.php.php – TML

2

Vous avez mentionné que votre système a très bien fonctionné. la longueur du contenu ne doit être définie que pour les POST

Cela peut aussi aider, c'est la spécification CGI/1.1. Il montre que les variables d'environnement doivent être définies:

http://graphcomp.com/info/specs/cgi11.html et ce lib.ru/WEBMASTER/cgi1_1spec/interface.html

Quelles ont été les variables d'environnement minimales dont vous aviez besoin pour obtenir les requêtes GET de travail?

+0

SCRIPT_FILENAME, REQUEST_METHOD et REDIRECT_STATUS. –

+0

REDIRECT_STATUS n'est pas requis si vous avez cgi.force_redirect = 0 dans votre fichier php.ini. J'ai essayé de l'ajouter et SCRIPT_FILENAME et il ne fonctionnera toujours pas –

Questions connexes