คำเตือนเกี่ยวกับการเลิกใช้งาน `$ 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_dataตั้งค่าเป็น 0 (ปิดใช้งาน) เกิดอะไรขึ้น?

ฉันไม่ต้องการ "หลีกเลี่ยงคำเตือน" โดยตั้งค่านี้เป็น -1 นี่จะเป็นการซ่อนคำเตือนและฉันยังคงเลิกใช้การกำหนดค่า ฉันต้องการแก้ปัญหาที่แหล่งที่มาและทราบว่าเหตุใด PHP จึงคิดว่าHTTP_RAW_POST_DATAเปิดใช้งานการเติมข้อมูล


ปัญหาเดียวกัน แต่สาเหตุ / วิธีแก้ไขที่แตกต่างกัน: stackoverflow.com/questions/25984623/…
rr-

คำเตือนนี้ทำให้ฉันมีปัญหาเมื่อเรียกใช้ที่จับของ PHP SoapServer () บน PHP> = 5.6 คำเตือนนี้จะแสดงผลในการตอบสนองของ SOAP เสมอดังนั้น __soapCall () ของ SoapClient จะได้รับ "ข้อยกเว้น SoapFault: [ไคลเอนต์] ดูเหมือนว่าเราไม่มีเอกสาร XML" ยากที่จะแก้ไขข้อบกพร่องเพราะปกติแล้วคำเตือนนี้จะไม่ปรากฏขึ้น
Johnny Wong

คำตอบ:


135

ปรากฎว่าความเข้าใจของฉันเกี่ยวกับข้อความแสดงข้อผิดพลาดนั้นไม่ถูกต้อง ฉันว่ามันมีตัวเลือกคำที่แย่มาก Googling ไปรอบ ๆ แสดงให้ฉันเห็นว่ามีคนอื่นเข้าใจข้อความผิดเหมือนกับที่ฉันทำ - ดูข้อบกพร่องของ PHP # 66763#

หลังจากหมดประโยชน์ "นี่คือวิธีที่ RM ต้องการให้เป็น" การตอบสนองต่อข้อบกพร่องนั้นโดย Mike Tyrael อธิบายว่าการตั้งค่าเป็น "-1" ไม่ได้ทำให้คำเตือนหายไป มันทำสิ่งที่ถูกต้องกล่าวคือปิดใช้งานการเติมตัวแปรผู้ร้ายอย่างสมบูรณ์ ปรากฎว่าการตั้งค่าเป็น 0 STILL จะเติมข้อมูลภายใต้สถานการณ์บางอย่าง พูดถึงดีไซน์ห่วย! ในการอ้างอิงPHP RFC :

เปลี่ยนการตั้งค่า always_populate_raw_post_data INI เพื่อยอมรับค่าสามค่าแทนที่จะเป็นสองค่า

  • -1: พฤติกรรมของอาจารย์; ไม่เคยเติมเงิน $ GLOBALS [HTTP_RAW_POST_DATA]
  • 0 / ปิด / อะไรก็ตาม: พฤติกรรม BC (เติมข้อมูลหากไม่ได้ลงทะเบียนชนิดเนื้อหาหรือวิธีการร้องขอเป็นวิธีอื่นที่ไม่ใช่ POST)
  • 1 / เปิด / ใช่ / จริง: พฤติกรรม BC (เติมข้อมูล $ GLOBALS [HTTP_RAW_POST_DATA] เสมอ)

ใช่แล้วการตั้งค่าเป็น -1 ไม่เพียง แต่หลีกเลี่ยงคำเตือนเช่นเดียวกับข้อความที่กล่าว แต่ในที่สุดมันก็ปิดการเติมตัวแปรนี้ซึ่งเป็นสิ่งที่ฉันต้องการ


23
tl; drนี่คือคำเตือนใบ้ที่ปรากฏขึ้นแม้ว่าคุณจะไม่ได้ใช้สิ่งที่เตือนก็ตาม ตั้งalways_populate_raw_post_dataเป็น -1
srcspider

7
always_populate_raw_post_data = -1ฉันได้ตั้งค่า ตอนนี้ยังคงมีคำเตือนมาและทำให้การตอบสนองของ json เสียหาย
itsazzad

2
ดังนั้นคำตอบในผลที่ออกมาเป็นไปของphp.iniไฟล์และการตั้งค่า (หรือ always_populate_raw_post_data = -1uncomment)
จอห์น

แต่ผมไม่ค่อยเข้าใจประเด็น นั่นคือว่าสิ่งที่เตือนไม่ว่าจะเป็น? To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.
Andreas

@ แอนเดรียประเด็นคือเหตุผลว่าทำไมจึงพูดเช่นนั้นนั่นคือความแตกต่างระหว่าง 0 ซึ่งเห็นได้ชัดว่า "ปิดใช้งาน" และ -1 ซึ่งก็คือ ... "คนพิการที่แข็งแรงกว่า"? →ความสับสน→เหตุผลสำหรับคำถามนี้ (และคำตอบ)
rr-

39

เมื่อสักครู่จนกระทั่งฉันพบข้อผิดพลาดนี้ ใส่คำตอบของฉันสำหรับทุกคนที่อาจพบปัญหานี้

ข้อผิดพลาดหมายความว่าคุณกำลังส่งคำขอ POST ว่างเปล่าเท่านั้น ข้อผิดพลาดนี้มักพบในคำขอ HTTPR โดยไม่มีการส่งผ่านพารามิเตอร์ เพื่อหลีกเลี่ยงข้อผิดพลาดนี้คุณสามารถเพิ่มพารามิเตอร์ลงใน POST ได้ตลอดเวลาโดยไม่ต้องเปลี่ยน php.ini

ชอบ:

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

4
นี่คือคำตอบที่ดีที่สุดที่ฉันพบสำหรับปัญหานี้! ฉันจัดการกับปัญหานี้มาเป็นเวลาหนึ่งเดือนแล้วและทำให้ฉันมองไปในทิศทางที่ไม่ถูกต้อง ฉันมี POST ว่างเปล่าโดยบังเอิญและเมื่อได้รับการแก้ไขแล้วทุกอย่างก็ใช้ได้ดี! ขอบคุณที่ช่วยฉันจากอาการปวดหัวอย่างมาก!
Craig Howell

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

และมองหาค่าของคีย์Loaded Configuration File ในกรณีของฉันphp.iniWAMP ใช้อยู่ใน:

C:\wamp64\bin\apache\apache2.4.23\bin\php.ini (symlink ไปยัง C: \ wamp64 \ bin \ php \ php5.6.25 \ phpForApache.ini)

ในที่สุดรีสตาร์ท WAMP (หรือคลิกเริ่มบริการทั้งหมดใหม่)


6

หาก.htaccessไฟล์ไม่สามารถใช้งานได้ให้สร้างในโฟลเดอร์รูทและวางโค้ดบรรทัดนี้

ใส่สิ่งนี้ใน.htaccessไฟล์ (ทดสอบแล้วว่าทำงานได้ดีสำหรับ API)

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

2
โปรดอธิบายพระเจ้าของฉัน
Zohaib

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 ตามคำตอบที่ได้รับการยอมรับแนะนำ ตั้งแต่ ocurs ข้อผิดพลาดเมื่อมีการยื่นคำร้องอาแจ็กซ์จะทำผ่านทางPOSTไม่มีพารามิเตอร์ใด ๆ GETทั้งหมดที่คุณต้องทำคือการเปลี่ยนวิธีการส่งเพื่อ

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

ยังคงเป็นตัวเลือกอื่นหากคุณต้องการเก็บวิธีนี้POSTไว้ไม่ว่าจะด้วยเหตุผลใดก็ตามคือการเพิ่มวัตถุ JSON ที่ว่างเปล่าลงใน ajax petititon

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

4

ฉันได้รับข้อความแสดงข้อผิดพลาดนี้เมื่อส่งข้อมูลจากแบบฟอร์ม html (วิธีการโพสต์) สิ่งที่ฉันต้องทำคือเปลี่ยนการเข้ารหัสในรูปแบบจาก "text / plain" เป็น "application / x-www-form-urlencoded" หรือ "multipart / form-data" ข้อความแสดงข้อผิดพลาดทำให้เข้าใจผิดมาก


3

ขออภัยคำตอบของ @EatOng ที่นี่ไม่ถูกต้องไม่ถูกต้องหลังจากอ่านคำตอบของเขาฉันได้เพิ่มตัวแปรจำลองให้กับคำขอ AJAX ทุกรายการที่ฉันกำลังเริ่มทำงาน (แม้ว่าบางส่วนจะมีฟิลด์อยู่แล้วก็ตาม) เพื่อให้แน่ใจว่าข้อผิดพลาดจะไม่ปรากฏขึ้น

แต่ตอนนี้ฉันเจอข้อผิดพลาดเดียวกันจาก PHP ฉันยืนยันอีกครั้งว่าฉันได้ส่งข้อมูล POST ไปแล้ว (ช่องอื่น ๆ พร้อมกับตัวแปรจำลองด้วย) รุ่น PHP 5.6.25, always_populate_raw_post_dataค่าถูกตั้งค่าให้0ค่าถูกตั้งค่าให้

นอกจากนี้ในขณะที่ฉันส่งapplication/jsonคำขอ PHP จะไม่เติมข้อมูลให้$_POSTแต่ฉันต้องไปjson_decode()ที่เนื้อหาคำขอ POST แบบดิบซึ่งเข้าถึงได้โดยphp://input.

ดังคำตอบโดย @ rr- อ้างอิง

0 / ปิด / อะไรก็ตาม: พฤติกรรม BC (เติมข้อมูลหากไม่ได้ลงทะเบียนชนิดเนื้อหาหรือวิธีการร้องขอเป็นวิธีอื่นที่ไม่ใช่ POST )

เนื่องจากวิธีการขอเป็น POST อย่างแน่นอนฉันเดาว่า PHP ไม่รู้จัก / ชอบไฟล์ Content-Type: application/jsonคำขอ (อีกแล้วทำไม ??)

ตัวเลือกที่ 1:

แก้ไขphp.iniไฟล์ด้วยตนเองและตั้งค่าตัวแปรผู้ร้ายเป็น-1ตามที่หลาย ๆ คำตอบแนะนำ

ตัวเลือก 2:

นี่คือบั๊ก PHP 5.6 อัปเกรด PHP

ตัวเลือก 3:

ตามที่ @ user9541305 ตอบไว้ที่นี่การเปลี่ยนContent-Typeคำขอ AJAX เป็นapplication/x-www-form-urlencodedหรือmultipart/form-dataจะทำให้ PHP เติมข้อมูล$_POSTจากเนื้อหา POSTed (เพราะ PHP ชอบ / รู้จักcontent-typeส่วนหัวเหล่านั้น!?)

ตัวเลือกที่ 4: รีสอร์ทสุดท้าย

ฉันไม่ต้องการเปลี่ยนContent-TypeAJAX มันจะทำให้เกิดปัญหามากในการดีบั๊ก (Chrome DevTools ดูตัวแปร POSTed ของคำขอ JSON เป็นอย่างดี)

ฉันกำลังพัฒนาสิ่งนี้สำหรับลูกค้าและไม่สามารถขอให้พวกเขาใช้ PHP ล่าสุดหรือแก้ไขไฟล์ php.ini เป็นทางเลือกสุดท้ายฉันจะตรวจสอบว่าตั้งค่าเป็นหรือไม่0และถ้าเป็นเช่นนั้นให้แก้ไขไฟล์php.iniไฟล์ในสคริปต์ PHP ของฉันเอง แน่นอนฉันจะต้องขอให้ผู้ใช้รีสตาร์ท apache น่าเสียดายจัง!

นี่คือโค้ดตัวอย่าง:

<?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ไฟล์ได้คุณสามารถตั้งรหัสบรรทัดนี้ที่ด้านบนสุดของไฟล์ PHP ของคุณ:

ini_set('always_populate_raw_post_data', -1);

ทำงานได้มากกว่าเดิม ฉันหวังว่ามันจะช่วยให้ใครบางคนประหยัดเวลาในการแก้ไขข้อบกพร่อง :)


0

หมายเหตุ: หากคุณใช้ PHPSTORM ใส่คำอธิบายภาพที่นี่


ฉันใช้เวลาหนึ่งชั่วโมงในการพยายามแก้ปัญหานี้โดยคิดว่าเป็นปัญหาเซิร์ฟเวอร์ php ของฉันดังนั้นฉันจึงตั้งค่า'always_populate_raw_post_data'เป็น'-1'ในphp.iniและไม่มีอะไรได้ผล

จนกระทั่งฉันพบว่าการใช้ phpStorm built in server เป็นสาเหตุของปัญหาดังรายละเอียดในคำตอบที่นี่: ตอบโดย LazyOne ที่นี่ฉันจึงคิดจะแบ่งปัน


-1

; always_populate_raw_post_data = -1 ใน php.init ลบความคิดเห็นของบรรทัดนี้ .. always_populate_raw_post_data = -1


4
อธิบายได้ไหม ?? เพราะอะไร? จัดรูปแบบ / เยื้องโพสต์ของคุณให้ถูกต้อง
ราวี

-1

ฉันเพิ่งได้รับวิธีแก้ปัญหานี้จากเพื่อน เขากล่าวว่า: เพิ่ม ob_start (); ภายใต้รหัสเซสชันของคุณ คุณสามารถเพิ่ม exit (); ใต้ส่วนหัว ฉันลองแล้วและได้ผล หวังว่านี่จะช่วยได้

สำหรับผู้ที่เช่า Hosting เซิร์ฟเวอร์ที่ไม่มีสิทธิ์เข้าถึงไฟล์ php.init

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.