2010-10-27 15 views
5

अद्यतन:PHP-CGI में POST डेटा कैसे पास करें?

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 

... और अभी भी कोई $_POST चर इस के उत्पादन में दिख रहे हैं:

हताशा का एक फिट में, मैं एक खोल में निम्नलिखित किया

<?php var_dump($_POST); ?> 

मैं एक छोटे से वेबसर्वर किके साथ इंटरफेस बनाने के लिए कोशिश कर रहा हूँबाइनरी। हालांकि, चीजें इतनी अच्छी तरह से नहीं जा रही हैं। php-cgi बाइनरी सही तरीके से GET अनुरोधों को संभालती है। जब POST अनुरोधों की बात आती है, तो $_POST सरणी खाली होती है, भले ही चीजें पोस्ट हो रही हों।

मैंने HTTP शीर्षलेखों को php-cgi बाइनरी में खिलाया गया है और वास्तव में पोस्ट डेटा और Content-type: application/x-www-form-urlencoded हेडर शामिल किया है।

php-cgi बाइनरी को यह देखने से क्या हो सकता है कि अनुरोध में POST डेटा शामिल है?

  • /sapi/cgi/cgi_main.c:

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


मैं प्रगति कर रहा हूँ, मैं PHP source code से कुछ सामान ऊपर खोदा गया हैनीचे इस सवाल का जवाब पढ़ने के बाद (। मुझे नहीं पता कि जहां इस समारोह से शुरू हो जाती है है)


, मैंने कोशिश की:

<?php 

var_dump($HTTP_RAW_POST_DATA); 

?> 

... जो उत्पादन झुकेंगे:

NULL 

... यह इंगित करता है कि यहां तक ​​कि अजनबी कुछ भी काम पर है।


मैं करीब हो रही है ... मैं /main/php_content_types.c में इस समारोह पाया:

SAPI_API SAPI_POST_READER_FUNC (php_default_post_reader)

... और यह कोड हो रहा है कि POST अनुरोधों को संसाधित करता है।

+0

PHP स्रोत के माध्यम से चुनने का समय: पी –

+1

मेरे पास कोई जवाब नहीं है, लेकिन पोस्ट डेटा stdin के माध्यम से आना चाहिए। –

+0

क्या आपका वेब सर्वर CGI 1.1 विनिर्देश को सही तरीके से कार्यान्वित करता है? – joschi

उत्तर

4

मैं अंत में यह लगा आउट:

जाहिर CONTENT_LENGTH वातावरण चर निर्धारित करने की आवश्यकता।

जोड़ना: यह ठीक से काम करने

CONTENT_LENGTH=6 
export CONTENT_LENGTH 
मेरी उदाहरण के लिए

ऊपर का कारण बनता है!

+0

पर अंतरों के बारे में और पढ़ें, आपको शायद कम से कम सामग्री-प्रकार भी सेट करना चाहिए - मूल रूप से, उन सभी HTTP सामग्री जिन्हें आप पाइप करने का प्रयास कर रहे थे सीजीआई शुरू होने से पहले शेल स्क्रिप्ट के आपके पिछले संस्करण में stdin में एक पर्यावरण चर के रूप में सेट करने की आवश्यकता है। ओह, और आपको यह जवाब "स्वीकृत" के रूप में चिह्नित करना चाहिए :) – TML

+0

@TML: True - मैंने अब 'सामग्री-प्रकार' जोड़ा है जो यह काम कर रहा है। मैं इसे पोस्ट करने के 24 घंटे बाद तक इसे स्वीकार नहीं कर सकता। (आईआईआरसी) –

0

$ HTTP_RAW_POST_DATA चर की जांच करने का प्रयास करें।

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

+0

यह 'NULL' के रूप में आ रहा है। ऐसा क्यों कर रहा है? –

+0

क्योंकि $ HTTP_RAW_POST_DATA एक ​​भयानक समाधान है - file_get_contents ('php: // input') बेहतर है, लेकिन मल्टीपार्ट/फॉर्म-डेटा एन्कोडेड डेटा के साथ काम नहीं करेगा। – TML

+0

http://us3.php.net/manual/en/wrappers.php.php – TML

2

आपने बताया कि आपके सिस्टम को ठीक है। सामग्री की लंबाई केवल POSTs

के लिए सेट करने की आवश्यकता है, यह भी मदद कर सकता है, यह CGI/1.1 विनिर्देश है। इससे पता चलता है क्या वातावरण चर तय करने की आवश्यकता:

http://graphcomp.com/info/specs/cgi11.html और इस lib.ru/WEBMASTER/cgi1_1spec/interface.html

न्यूनतम वातावरण चर आप काम कर अनुरोध प्राप्त पाने के लिए की जरूरत क्या थे?

+0

एससीआरआईपीT_FILENAME, REQUEST_METHOD, और RedIRECT_STATUS। –

+0

यदि आपके php.ini में cgi.force_redirect = 0 है तो RedIRECT_STATUS की आवश्यकता नहीं है। मैंने इसे और SCRIPT_FILENAME जोड़ने का प्रयास किया और यह अभी भी काम नहीं करेगा –