$ $ HTTP_RAW_POST_DATA` के बारे में चेतावनी दी जा रही है


121

मैंने PHP 5.6.0 पर स्विच किया और अब मुझे हर जगह निम्नलिखित चेतावनी मिलती है:

Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will
be removed in a future version. To avoid this warning set
'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream
instead. in Unknown on line 0

Warning: Cannot modify header information - headers already sent in Unknown on line 0

ठीक है, मैं कुछ पदावनत सुविधा पर भरोसा करता हूं। सिवाय इसके कि मैं नहीं!

  1. मैंने अपनी किसी भी स्क्रिप्ट में इस चर का कभी उपयोग नहीं किया है। सच कहूं तो मुझे पता नहीं था कि यह अस्तित्व में भी है।
  2. phpinfo()दिखाता है कि मैंने always_populate_raw_post_data0 (अक्षम) पर सेट किया है। तो क्या चल रहा है?

मैं इस मान को -1 पर सेट करके "चेतावनी से बचना" नहीं चाहता। यह सिर्फ चेतावनी को छिपाएगा, और मेरे पास अभी भी अपग्रेड किया गया कॉन्फ़िगरेशन होगा। मैं इसके स्रोत पर समस्या को हल करना चाहता हूं और यह जानना चाहता हूं कि पीएचपी को क्यों लगता है कि HTTP_RAW_POST_DATAआबादी चालू है।


एक ही समस्या, लेकिन संभव विभिन्न कारण / समाधान: stackoverflow.com/questions/25984623/…
rr-

PHP सोपसेवर के हैंडल () को PHP> = 5.6 पर चलाने पर यह चेतावनी मुझे परेशानी देती है। यह चेतावनी हमेशा SOAP के जवाब में आउटपुट की जाएगी, ताकि एक SoapClient के __soapCall () को "SoapFault अपवाद: [क्लाइंट] ऐसा लगे कि हमें कोई XML दस्तावेज़ नहीं मिला" अपवाद। इसलिए डिबग करना कठिन है क्योंकि यह चेतावनी आम तौर पर दिखाई नहीं देगी।
जॉनी वोंग

जवाबों:


135

यह पता चला कि त्रुटि संदेश की मेरी समझ गलत थी। मैं कहूंगा कि इसमें शब्दों का बहुत कम विकल्प है। मेरे चारों ओर गुग्लिंग ने मुझे किसी और को संदेश गलत समझा जैसे मैंने किया था - PHP बग # 66763 देखें

पूरी तरह से अनहेल्दी के बाद "यह आरएम जिस तरह से चाहते थे।" माइक द्वारा उस बग के जवाब में, टायरेल बताते हैं कि इसे "-1" पर सेट करना केवल दूर जाने की चेतावनी नहीं है। यह सही काम करता है , यानी यह पूरी तरह से अपराधी चर को आबाद करने में अक्षम है। कि यह 0 पर सेट होने पता चला है अभी भी कुछ परिस्थितियों में डेटा भरता है। खराब डिजाइन के बारे में बात करो! PHP RFC का हवाला देते हैं :

हमेशा दो के बजाय तीन मानों को स्वीकार करने के लिए IN_ सेटिंग को हमेशा_पोपलेट_राव_पोस्ट_डेटा बदलें।

  • -1: गुरु का व्यवहार; $ GLOBALS [HTTP_RAW_POST_DATA] को कभी आबाद न करें
  • 0 / बंद / जो भी हो: बीसी व्यवहार (पॉपुलेट-प्रकार पंजीकृत नहीं है या अनुरोध विधि POST के अलावा अन्य है)
  • 1 / पर / हाँ / सच: बीसी व्यवहार (हमेशा $ GLOBALS [HTTP_RAW_POST_DATA])

तो हाँ, इसे -1 पर सेट करना न केवल चेतावनी से बचा जाता है, जैसा संदेश ने कहा, लेकिन यह अंत में इस चर को आबाद करने में भी अक्षम करता है , जो कि मैं चाहता था।


23
tl; dr यह एक गूंगा चेतावनी है जो प्रकट होता है भले ही आप उस चीज़ का उपयोग न करें जिसके खिलाफ यह चेतावनी देता है; सेट हमेशा_पोपलेट_राव_पोस्ट_डाटा से -1
srcspider

7
मैंने इसे सेट किया है always_populate_raw_post_data = -1। अभी भी चेतावनी आ रही है और
जौन की

2
इसलिए प्रभाव का उत्तर आपकी php.iniफ़ाइल पर जाना और सेट करना (या अनकम्फ़र्ट करना) है always_populate_raw_post_data = -1
जॉन

लेकिन मैं वास्तव में बात नहीं है। ठीक यही चेतावनी कह रही है? To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.
एंड्रियास

@ और बात का कारण यह है कि ऐसा क्यों कहा जाता है, अर्थात 0 के बीच का अंतर, जो स्पष्ट रूप से "अक्षम", और -1 है, जो ... "मजबूत विकलांग" है? → भ्रम → इस प्रश्न का कारण (और उत्तर)।
rr-

39

जब तक मैं इस त्रुटि के पार नहीं आया, तब तक थोड़ी देर हो गई। जो कोई भी इस मुद्दे पर ठोकर खा सकता है, उसके लिए अपना जवाब दें।

त्रुटि का मतलब केवल यह है कि आप एक खाली पोस्ट अनुरोध भेज रहे हैं। यह त्रुटि सामान्यतः HTTPRequests पर पाई जाती है जिसमें कोई पैरामीटर पारित नहीं हुआ है। इस त्रुटि से बचने के लिए, आप हमेशा php.ini को बदले बिना POST में एक पैरामीटर जोड़ सकते हैं।

पसंद:

$.post(URL_HERE
    ,{addedvar : 'anycontent'}
    ,function(d){
       doAnyHere(d);
    }
    ,'json' //or 'html','text'
);

4
यह इस मुद्दे के लिए मुझे मिला सबसे अच्छा जवाब है! मैं एक महीने से इस समस्या से निपट रहा हूं और इसने मुझे गलत दिशा में देखा है। मेरे पास बस दुर्घटना पर एक खाली पोस्ट था और एक बार तय हो गया कि सब कुछ बहुत अच्छा है! मुझे भयानक सिरदर्द से बचाने के लिए धन्यवाद!
क्रेग हॉवेल

34

मैंने nginx सर्वर (DigitalOcean) पर एक ही समस्या का अनुभव किया - मुझे बस इतना करना है rootकि फ़ाइल को लॉग इन करें और संशोधित करें /etc/php5/fpm/php.ini

always_populate_raw_post_dataमैं पहली बार चलाने के साथ लाइन खोजने के लिए grep:

grep -n 'always_populate_raw_post_data' php.ini

वह रेखा लौट आई 704

704:;always_populate_raw_post_data = -1

फिर बस संपादक के php.iniसाथ उस लाइन पर खोलें vi:

vi +704 php.ini

सेमी कॉलोन को इसे अनइंस्टॉल करने के लिए निकालें और फाइल को सेव करें :wq

अंत में सर्वर को रिबूट करें और त्रुटि चली गई।


3
यदि लाइन में टिप्पणी की गई है कि php.iniआप शायद php.ini के विकास कॉन्फ़िगरेशन का उपयोग कर रहे हैं।
BadHorsie

13

यदि आप WAMP का उपयोग कर रहे हैं ...

आप जोड़ सकते हैं या संपत्ति uncomment चाहिए always_populate_raw_post_dataमें php.iniऔर करने के लिए अपने मूल्य के लिए सेट -1। मेरे मामले php.iniमें स्थित है:

C:\wamp64\bin\php\php5.6.25\php.ini

.. लेकिन अगर आपको अभी भी चेतावनी मिल रही है (जैसा कि मैं था)

आप यह भी तय करना चाहिए always_populate_raw_post_data = -1में phpForApache.ini:

C:\wamp64\bin\php\php5.6.25\phpForApache.ini

यदि आपको यह फ़ाइल नहीं मिल रही है, तो ब्राउज़र विंडो खोलें और निम्न पर जाएँ:

http://localhost/?phpinfo=1

और भरी हुई कॉन्फ़िगरेशन फ़ाइल कुंजी के मूल्य की तलाश करें । मेरे मामले में php.iniWAMP द्वारा उपयोग किया जाता है:

C:\wamp64\bin\apache\apache2.4.23\bin\php.ini (सी के लिए सहानुभूति: \ wamp64 \ bin \ php \ php5.6.25 \ phpForAp4.in/)

अंत में WAMP को पुनः आरंभ करें (या सभी सेवाओं को पुनः आरंभ करें पर क्लिक करें)


6

यदि .htaccessफ़ाइल उपलब्ध नहीं है, तो इसे रूट फ़ोल्डर पर बनाएं और कोड की इस पंक्ति को चिपकाएं।

इसे .htaccessफ़ाइल में डालें (एपीआई के लिए अच्छी तरह से परीक्षण किया गया)

<IfModule mod_php5.c>
    php_value always_populate_raw_post_data -1
</IfModule>

2
कृपया मेरे प्रभु को बताएं
ज़ोहैब

5

अकारण

always_populate_raw_post_data = -1 

php.ini में (लाइन # 703) और APACHE सेवाओं को फिर से शुरू करने से मुझे संदेश से छुटकारा पाने में मदद मिलती है

; Always populate the $HTTP_RAW_POST_DATA variable. PHP's default behavior is
; to disable this feature and it will be removed in a future version.
; If post reading is disabled through enable_post_data_reading,
; $HTTP_RAW_POST_DATA is *NOT* populated.
; http://php.net/always-populate-raw-post-data
; always_populate_raw_post_data = -1

4

स्वीकृत जवाब के अनुसार php.init को बदलने के बाद भी कोई भी इस समस्या से जूझ रहा है। जब त्रुटि त्रुटि तब होती है जब एक अजाक्स याचिका POSTबिना किसी पैरामीटर के माध्यम से बनाई जाती है, तो आपको भेजने की विधि को बदलना होगा GET

var xhr = $.ajax({
   url:  url,
   type: "GET",
   dataType: "html",
   timeout: 500,
});

फिर भी एक अन्य विकल्प यदि आप POSTकिसी भी कारण से विधि रखना चाहते हैं , तो अजाक्स पेटिटॉन में एक खाली JSON ऑब्जेक्ट जोड़ना है।

var xhr = $.ajax({
   url:  url,
   type: "POST",
   data: {name:'emtpy_petition_data', value: 'empty'}
   dataType: "html",
   timeout: 500,
});

4

Html फॉर्म (पोस्ट विधि) से डेटा भेजते समय मुझे यह त्रुटि संदेश मिला। मुझे केवल इतना करना था कि "टेक्स्ट / प्लेन" से फॉर्म में एन्कोडिंग को "एप्लीकेशन / एक्स-www-फॉर्म-यूरलेंकोडेड" या "मल्टीपार्ट / फॉर्म-डेटा" में बदलना था। त्रुटि संदेश बहुत भ्रामक था।


2

दुर्भाग्य से, @EatOng द्वारा यहाँ यह उत्तर सही नहीं है । उनके जवाब को पढ़ने के बाद मैंने हर AJAX अनुरोध में एक डमी वैरिएबल जोड़ा जो मैं फायर कर रहा था (भले ही उनमें से कुछ के पास पहले से ही कुछ क्षेत्र थे) बस यह सुनिश्चित करने के लिए कि त्रुटि कभी प्रकट न हो।

लेकिन अभी मैं PHP से एक ही लानत त्रुटि के पार आया था। मैंने दोहरे पुष्टि की कि मैंने कुछ POST डेटा (कुछ अन्य फ़ील्ड भी डमी चर के साथ) भेजे थे। PHP संस्करण 5.6.25, always_populate_raw_post_dataमान पर सेट है 0

इसके अलावा, जैसा कि मैं एक application/jsonअनुरोध भेज रहा हूं , PHP इसे करने के लिए $_POSTआबाद नहीं कर रहा है, बल्कि मुझे json_decode()कच्चे POST अनुरोध निकाय द्वारा सुलभ हैं php://input

@ Rr-cites द्वारा उत्तर के रूप में,

0 / ऑफ / जो भी: बीसी व्यवहार (पॉपुलेट -पंजीकृत नहीं है या अनुरोध विधि POST के अलावा अन्य है )।

क्योंकि अनुरोध विधि निश्चित POST के लिए है, मुझे लगता है कि PHP मेरे Content-Type: application/jsonअनुरोध (फिर, क्यों ??) को नहीं पहचानता / पसंद नहीं करता था ।

विकल्प 1:

php.iniफ़ाइल को मैन्युअल रूप से संपादित करें और अपराधी चर को सेट करें -1, जैसा कि यहां दिए गए कई उत्तर सुझाते हैं।

विकल्प 2:

यह एक PHP 5.6 बग है। PHP अपग्रेड करें।

विकल्प 3:

जैसा कि @ user9541305 ने यहाँ उत्तर दिया है, Content-TypeAJAX के अनुरोध को बदलने application/x-www-form-urlencodedया multipart/form-dataPHP $_POSTको पोस्ट किए गए शरीर से पॉप्युलेट करेगा (क्योंकि PHP उन content-typeहेडर को पहचानता / पहचानता है !?)।

विकल्प 4: अंतिम परिणाम

खैर, मैं Content-TypeAJAX को बदलना नहीं चाहता था , इससे डिबगिंग के लिए बहुत परेशानी होगी। (क्रोम DevTools अच्छी तरह से JSON अनुरोधों के पोस्ट किए गए चर को देखता है।)

मैं एक ग्राहक के लिए यह बात विकसित कर रहा हूं और उन्हें नवीनतम PHP का उपयोग करने के लिए नहीं कह सकता, न ही php.ini फ़ाइल को संपादित करने के लिए। अंतिम उपाय के रूप में, मैं अभी जाँच करूँगा कि क्या यह सेट है 0और यदि ऐसा है, तो php.iniफ़ाइल को अपनी PHP स्क्रिप्ट में ही संपादित करें । बेशक, मुझे उपयोगकर्ता को अपाचे को फिर से शुरू करने के लिए कहना होगा। कितनी शर्म की बात है!

यहाँ एक नमूना कोड है:

<?php

if(ini_get('always_populate_raw_post_data') != '-1')
{
    // Get the path to php.ini file
    $iniFilePath = php_ini_loaded_file();

    // Get the php.ini file content
    $iniContent = file_get_contents($iniFilePath);

    // Un-comment (if commented) always_populate_raw_post_data line, and set its value to -1
    $iniContent = preg_replace('~^\s*;?\s*always_populate_raw_post_data\s*=\s*.*$~im', 'always_populate_raw_post_data = -1', $iniContent);

    // Write the content back to the php.ini file
    file_put_contents($iniFilePath, $iniContent);

    // Exit the php script here
    // Also, write some response here to notify the user and ask to restart Apache / WAMP / Whatever.
    exit;
}

0

ठीक है, अगर वहाँ कोई साझा होस्टिंग पर है और php.iniफ़ाइल तक पहुंच नहीं है , तो आप अपनी पीएचपी फ़ाइलों के शीर्ष पर कोड की इस पंक्ति को सेट कर सकते हैं:

ini_set('always_populate_raw_post_data', -1);

उसी का अधिक काम करता है। मुझे आशा है कि यह किसी को कुछ डिबगिंग समय बचाता है :)


0

NB: यदि आप PHPSTORM का उपयोग कर रहे हैं यहाँ छवि विवरण दर्ज करें


मैंने इस समस्या को हल करने के लिए एक घंटे का समय बिताया, यह सोचकर कि यह मेरी php सर्वर समस्या थी, इसलिए मैंने php.ini में 'always_populate_raw_post_data' को '-1' पर सेट किया और कुछ भी काम नहीं किया।

जब तक मुझे पता चला कि सर्वर में निर्मित phpStorm का उपयोग करना समस्या का कारण बनता है जैसा कि यहां दिए गए उत्तर में विस्तृत है: यहाँ पर LazyOne द्वारा उत्तर दिया गया है , इसलिए मैंने इसे साझा करने के बारे में सोचा।


-1

; हमेशा_populate_raw_post_data = -1 में php.in इस लाइन की टिप्पणी को हटा दें .. हमेशा_पोपलेट_करते_पाटा_दाता = -1


4
क्या आप समझाएँगे?? क्यों ? साथ ही, अपनी पोस्ट को ठीक से फॉर्मेट / इंडेंट करें।
रवि 18

-1

मुझे बस एक दोस्त से इस समस्या का हल मिला। उन्होंने कहा: ob_start () जोड़ें; आपके सत्र कोड के तहत। आप बाहर निकलें जोड़ सकते हैं (); हेडर के नीचे। मैंने इसे आजमाया और यह काम आया। उम्मीद है की यह मदद करेगा

यह उन लोगों के लिए है, जो एक किराए पर होस्टिंग से जुड़े हैं, जिनके पास php.init फाइल नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.