Peringatan tentang `$ HTTP_RAW_POST_DATA` tidak digunakan lagi

121

Saya beralih ke PHP 5.6.0 dan sekarang saya mendapatkan peringatan berikut di mana-mana:

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

Baiklah, saya mengandalkan beberapa fitur yang sudah usang. Kecuali aku tidak!

  1. Saya belum pernah menggunakan variabel ini di skrip saya. Sejujurnya saya tidak tahu itu ada.
  2. phpinfo()menunjukkan bahwa saya telah always_populate_raw_post_dataset ke 0 (dinonaktifkan). Jadi apa yang terjadi?

Saya tidak ingin "menghindari peringatan" dengan menyetel nilai ini ke -1. Ini hanya akan menyembunyikan peringatan, dan saya masih akan menghentikan konfigurasi. Saya ingin menyelesaikan masalah di sumbernya dan mengetahui mengapa PHP berpikir bahwa HTTP_RAW_POST_DATApengisian dihidupkan.

rr-
sumber
Masalah yang sama, tetapi kemungkinan penyebab / solusi berbeda: stackoverflow.com/questions/25984623/…
rr-
Peringatan ini memberi saya masalah saat menjalankan PHP SoapServer's handle () pada PHP> = 5.6. Peringatan ini akan selalu dikeluarkan dalam respons SOAP, sehingga __soapCall () SoapClient akan mendapatkan pengecualian "SoapFault pengecualian: [Klien] sepertinya kami tidak mendapatkan dokumen XML". Sangat sulit untuk di-debug karena peringatan ini biasanya tidak akan muncul.
Johnny Wong

Jawaban:

135

Ternyata pemahaman saya tentang pesan error tersebut salah. Saya akan mengatakan itu fitur pilihan kata yang sangat buruk. Mencari-cari di Google menunjukkan kepada saya bahwa ada orang lain yang salah memahami pesan tersebut persis seperti yang saya lakukan - lihat bug PHP # 66763 .

Setelah benar-benar tidak membantu, "Inilah yang diinginkan RM." menanggapi bug itu oleh Mike, Tyrael menjelaskan bahwa menyetelnya ke "-1" tidak hanya membuat peringatan itu menghilang. Ia melakukan hal yang benar , yaitu menonaktifkan sepenuhnya pengisian variabel pelakunya. Ternyata menyetelnya ke 0 MASIH mengisi data dalam beberapa keadaan. Bicara tentang desain yang buruk! Untuk mengutip PHP RFC :

Ubah setelan always_populate_raw_post_data INI untuk menerima tiga nilai, bukan dua.

  • -1: Perilaku master; jangan pernah mengisi $ GLOBALS [HTTP_RAW_POST_DATA]
  • 0 / off / apa saja: perilaku BC (terisi jika tipe konten tidak terdaftar atau metode permintaan selain POST)
  • 1 / on / yes / true: Perilaku BC (selalu mengisi $ GLOBALS [HTTP_RAW_POST_DATA])

Jadi ya, menyetelnya ke -1 tidak hanya menghindari peringatan, seperti yang dikatakan pesan tersebut, tetapi juga akhirnya menonaktifkan pengisian variabel ini, yang saya inginkan.

rr-
sumber
23
tl; dr ini adalah peringatan bodoh yang muncul bahkan jika Anda tidak menggunakan hal yang diperingatkan; atur always_populate_raw_post_data ke -1
srcspider
7
saya telah mengaturnya always_populate_raw_post_data = -1. masih sekarang peringatan datang dan merusak respon json
itsazzad
2
Jadi jawaban yang berlaku adalah pergi ke php.inifile Anda dan set (atau hapus komentar) always_populate_raw_post_data = -1.
Yohanes
Tapi saya tidak mengerti maksudnya. Itulah tepatnya yang dikatakan peringatan itu? To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.
Andreas
@Andreas Intinya adalah alasan mengapa dikatakan bahwa, yaitu perbedaan antara 0, yang tampaknya "dinonaktifkan", dan -1, yang ... "cacat lebih kuat"? → kebingungan → alasan pertanyaan (dan jawaban) ini.
rr-
39

Sudah beberapa saat sampai saya menemukan kesalahan ini. Berikan jawaban saya untuk siapa saja yang mungkin tersandung pada masalah ini.

Kesalahan hanya berarti Anda mengirim permintaan POST kosong. Kesalahan ini biasanya ditemukan di HTTPRequests tanpa parameter yang diteruskan. Untuk menghindari kesalahan ini, Anda selalu dapat menambahkan parameter ke POST tanpa mengubah php.ini.

Suka:

$.post(URL_HERE
    ,{addedvar : 'anycontent'}
    ,function(d){
       doAnyHere(d);
    }
    ,'json' //or 'html','text'
);
Makan Ong
sumber
4
Ini adalah jawaban terbaik yang saya temukan untuk masalah ini! Saya telah berurusan dengan masalah ini terus menerus selama sebulan dan itu membuat saya melihat ke arah yang salah. Saya hanya memiliki POST kosong karena kecelakaan dan setelah itu diperbaiki semuanya bekerja dengan baik! Terima kasih telah menyelamatkan saya dari sakit kepala yang parah!
Craig Howell
34

Saya mengalami masalah yang sama di server nginx (DigitalOcean) - yang harus saya lakukan hanyalah masuk rootdan memodifikasi file /etc/php5/fpm/php.ini.

Untuk menemukan garis dengan always_populate_raw_post_dataI run grep:

grep -n 'always_populate_raw_post_data' php.ini

Itu mengembalikan garis 704

704:;always_populate_raw_post_data = -1

Kemudian cukup buka php.inidi baris itu dengan vieditor:

vi +704 php.ini

Hapus titik koma untuk menghapus komentar dan simpan file :wq

Terakhir, reboot server dan kesalahannya hilang.

Sebastian Sulinski
sumber
3
Jika baris tersebut diberi komentar di Anda, php.iniAnda mungkin menggunakan konfigurasi pengembangan php.ini.
BadHorsie
13

Jika Anda menggunakan WAMP ...

Anda harus menambahkan atau tanda komentar properti always_populate_raw_post_datadi php.inidan set nilainya ke-1 . Dalam kasus saya php.initerletak di:

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

..tapi jika Anda masih mendapatkan peringatan (seperti saya dulu)

Anda juga harus mengatur always_populate_raw_post_data = -1 di phpForApache.ini:

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

Jika Anda tidak dapat menemukan file ini, buka jendela browser dan buka:

http://localhost/?phpinfo=1

dan cari nilai Loaded Configuration File kunci . Dalam kasus saya yang php.inidigunakan oleh WAMP terletak di:

C:\wamp64\bin\apache\apache2.4.23\bin\php.ini (tautkan ke C: \ wamp64 \ bin \ php \ php5.6.25 \ phpForApache.ini)

Terakhir restart WAMP (atau klik restart semua layanan)

Ricardo Tribaldos
sumber
6

Jika .htaccess file tidak tersedia, buat di folder root dan lewati baris kode ini.

Taruh ini di .htaccessfile (diuji bekerja dengan baik untuk API)

<IfModule mod_php5.c>
    php_value always_populate_raw_post_data -1
</IfModule>
Shaan Ansari
sumber
2
tolong jelaskan Tuanku
Zohaib
5

Tidak mengomentari

always_populate_raw_post_data = -1 

di php.ini (baris # 703) dan memulai kembali layanan APACHE membantu saya menyingkirkan pesan tersebut

; 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
Nava Bogatee
sumber
4

Bagi siapa pun yang masih berjuang dengan masalah ini setelah mengubah php.init seperti yang disarankan oleh jawaban yang diterima. Karena kesalahan terjadi ketika petisi ajax dibuat melalui POSTtanpa parameter apa pun yang harus Anda lakukan adalah mengubah metode kirim ke GET.

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

Masih opsi lain jika Anda ingin mempertahankan metode POSTkarena alasan apa pun adalah menambahkan objek JSON kosong ke ajax petititon.

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

Saya mendapat pesan kesalahan ini saat mengirim data dari bentuk html (Metode posting). Yang harus saya lakukan adalah mengubah pengkodean dalam bentuk dari "teks / biasa" menjadi "aplikasi / x-www-form-urlencoded" atau "multipart / form-data". Pesan kesalahan itu sangat menyesatkan.

pengguna9541305
sumber
3

Sayangnya, jawaban @EatOng ini salah . Setelah membaca jawabannya, saya menambahkan variabel dummy ke setiap permintaan AJAX yang saya aktifkan (bahkan jika beberapa di antaranya sudah memiliki beberapa bidang) hanya untuk memastikan kesalahan tidak pernah muncul.

Tapi sekarang saya menemukan kesalahan yang sama dari PHP. Saya mengkonfirmasi dua kali bahwa saya telah mengirim beberapa data POST (beberapa bidang lain juga bersama dengan variabel dummy). Versi PHP 5.6.25, always_populate_raw_post_datanilai ditetapkan ke 0.

Juga, saat saya mengirim application/jsonpermintaan, PHP tidak mengisinya $_POST, melainkan saya harus ke json_decode()badan permintaan POST mentah, dapat diakses oleh php://input.

Sebagai jawaban dari @ rr- cites,

0 / off / apa saja: perilaku BC (terisi jika tipe konten tidak terdaftar atau metode permintaan selain POST ).

Karena metode permintaan pasti POST, saya kira PHP tidak mengenali / menyukai Content-Type: application/jsonpermintaan saya (sekali lagi, mengapa ??).

PILIHAN 1:

Edit php.inifile secara manual dan setel variabel pelakunya ke -1, seperti yang disarankan oleh banyak jawaban di sini.

PILIHAN 2:

Ini adalah bug PHP 5.6. Tingkatkan PHP.

OPSI 3:

Seperti yang dijawab oleh @ user9541305 di sini, mengubah Content-Typepermintaan AJAX menjadi application/x-www-form-urlencodedatau multipart/form-dataakan membuat PHP mengisi $_POSTdari badan POSTed (karena PHP menyukai / mengenali content-typeheader tersebut !?).

OPSI 4: RESOR TERAKHIR

Yah, saya tidak ingin mengubah Content-TypeAJAX, itu akan menyebabkan banyak masalah untuk debugging. (Chrome DevTools melihat dengan baik variabel POST dari permintaan JSON.)

Saya mengembangkan hal ini untuk klien dan tidak dapat meminta mereka untuk menggunakan PHP terbaru, atau mengedit file php.ini. Sebagai upaya terakhir, saya hanya akan memeriksa apakah sudah diatur 0dan jika demikian, edit php.inifile dalam skrip PHP saya itu sendiri. Tentu saja saya harus meminta pengguna untuk merestart apache. Sayang sekali!

Berikut ini contoh kode:

<?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;
}
Jay Dadhania
sumber
0

Nah, jika ada seseorang di luar sana di shared hosting dan tanpa akses ke php.inifile, Anda dapat mengatur baris kode ini di bagian paling atas file PHP Anda:

ini_set('always_populate_raw_post_data', -1);

Bekerja lebih sama. Saya harap ini menghemat waktu debugging seseorang :)

Martins
sumber
0

NB: JIKA ANDA MENGGUNAKAN PHPSTORM masukkan deskripsi gambar di sini


Saya menghabiskan satu jam mencoba untuk memecahkan masalah ini, berpikir bahwa itu adalah masalah server php saya, Jadi saya menetapkan 'always_populate_raw_post_data' ke '-1' di php.ini dan tidak ada yang berhasil.

Sampai saya mengetahui bahwa menggunakan phpStorm built in server adalah penyebab masalah seperti yang dijelaskan dalam jawaban di sini: Jawaban oleh LazyOne Di sini , Jadi saya berpikir untuk membagikannya.

KADEM Mohammed
sumber
-1

; always_populate_raw_post_data = -1 di php.init hapus komentar dari baris ini .. always_populate_raw_post_data = -1

Tejaswi Tandel
sumber
4
bisakah kamu menjelaskan ?? kenapa? Juga, format / indentasi posting Anda dengan benar.
Ravi
-1

Saya baru saja mendapat solusi untuk masalah ini dari seorang teman. dia berkata: Tambahkan ob_start (); di bawah kode sesi Anda. Anda dapat menambahkan exit (); di bawah tajuk. Saya mencobanya dan berhasil. Semoga ini membantu

Ini untuk mereka yang menggunakan server Hosting sewaan yang tidak memiliki akses ke file php.init.

kjava.dll
sumber