"$ HTTP_RAW_POST_DATA" nın kullanımdan kaldırılmasıyla ilgili uyarı


121

PHP 5.6.0'a geçtim ve şimdi her yerde aşağıdaki uyarıyı alıyorum:

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

Güzel, kullanımdan kaldırılan bazı özelliklere güveniyorum. Yapmamam dışında !

  1. Bu değişkeni hiçbir komut dosyamda kullanmadım. Dürüst olmak gerekirse, varlığından bile haberim yoktu.
  2. phpinfo()always_populate_raw_post_data0 (devre dışı) olarak ayarladığımı gösterir . Peki neler oluyor?

Bu değeri -1 olarak ayarlayarak "uyarıdan kaçınmak" istemiyorum. Bu sadece uyarıyı gizleyecektir ve hala kullanımdan kaldırılmış yapılandırmaya sahibim. Sorunu kaynağında çözmek ve PHP'nin neden doldurmanın açık olduğunu düşündüğünü bilmek istiyorum HTTP_RAW_POST_DATA.


Aynı sorun, ancak olası farklı neden / çözüm: stackoverflow.com/questions/25984623/…
rr-

Bu uyarı PHP SoapServer'ın handle () 'yi PHP> = 5.6 üzerinde çalıştırırken bana sorun çıkarıyor. Bu uyarı her zaman SOAP yanıtında verilir, böylece bir SoapClient'ın __soapCall () "SoapFault istisnası: [İstemci] XML belgemiz yokmuş gibi görünür" istisnasını alır. Hata ayıklamak çok zor çünkü bu uyarı normalde görünmez.
Johnny Wong

Yanıtlar:


135

Hata mesajını anlamamın yanlış olduğu ortaya çıktı. Çok zayıf kelime seçenekleri olduğunu söyleyebilirim. Etrafta dolaşmak bana başka birinin mesajı tam olarak benim yaptığım gibi yanlış anladığını gösterdi - bkz. PHP hatası # 66763 .

Tamamen faydasız olduktan sonra, "RM'lerin istediği yol buydu." Mike'ın bu hataya verdiği yanıtta, Tyrael bunu "-1" olarak ayarlamanın sadece ortadan kalkma uyarısı yapmadığını açıklıyor. It does doğru olanı tamamen suçlu değişkeni doldurma devre dışı bırakır yani. 0 STILL olarak ayarlanmasının bazı durumlarda verileri doldurduğu ortaya çıktı. Kötü tasarım hakkında konuşun! PHP RFC'den alıntı yapmak için :

Always_populate_raw_post_data INI ayarını iki yerine üç değeri kabul edecek şekilde değiştirin.

  • -1: Ustanın davranışı; $ GLOBALS'ı hiç doldurmayın [HTTP_RAW_POST_DATA]
  • 0 / kapalı / ne olursa olsun: BC davranışı (içerik türü kayıtlı değilse veya istek yöntemi POST'tan farklıysa doldurun)
  • 1 / açık / evet / doğru: BC davranışı (her zaman $ GLOBALS [HTTP_RAW_POST_DATA] doldurun)

Yani evet, -1 olarak ayarlamak mesajın söylediği gibi sadece uyarıdan kaçınmakla kalmaz, aynı zamanda bu değişkeni doldurmayı da devre dışı bırakır , ki istediğim buydu.


23
tl; dr bu, size karşı uyardığı şeyi kullanmasanız bile görünen aptalca bir uyarıdır; always_populate_raw_post_data değerini -1 olarak ayarlayın
srcspider

7
ben ayarladım always_populate_raw_post_data = -1. hala şimdi uyarı geliyor ve json cevabını
bozuyor

2
Dolayısıyla, aslında cevap php.inidosyanıza gidip ayarlamak (veya açıklamayı kaldırmaktır ) always_populate_raw_post_data = -1.
John

Ama asıl noktayı anlamıyorum. Budur tam olarak uyarı ne söylediğini? To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.
Andreas

@Ve bunun nedeni, yani görünüşte "devre dışı" olan 0 ile -1, yani ... "daha güçlü devre dışı" olduğunu söylemesinin sebebi mi? → karışıklık → bu sorunun nedeni (ve cevabı).
rr-

39

Bu hatayla karşılaşana kadar bir süre oldu. Bu konuyla karşılaşabilecek herkes için cevabımı sunun.

Hata yalnızca boş bir POST isteği gönderdiğiniz anlamına gelir. Bu hata genellikle hiçbir parametre geçirilmeden HTTP İsteklerinde bulunur. Bu hatayı önlemek için, php.ini'yi değiştirmeden her zaman POST'a bir parametre ekleyebilirsiniz.

Sevmek:

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

4
Bu sorun için bulduğum en iyi cevap bu! Bir aydır bu sorunla sürekli uğraşıyorum ve bu beni yanlış yöne çevirdi. Kaza anında boş bir POST aldım ve bu bir kez düzeltildiğinde her şey harika çalıştı! Beni korkunç bir baş ağrısından kurtardığın için teşekkürler!
Craig Howell

34

Aynı sorunu nginx sunucusunda (DigitalOcean) da yaşadım - tek yapmam gereken, rootdosya olarak oturum açmak ve dosyayı değiştirmek /etc/php5/fpm/php.ini.

always_populate_raw_post_dataİlk çalıştırdığım çizgiyi bulmak için grep:

grep -n 'always_populate_raw_post_data' php.ini

Bu çizgiyi geri getirdi 704

704:;always_populate_raw_post_data = -1

Ardından php.inibu satırda vieditörle açın:

vi +704 php.ini

Açıklamasını kaldırmak ve dosyayı kaydetmek için noktalı virgülü kaldırın :wq

Son olarak sunucuyu yeniden başlatın ve hata ortadan kalktı.


3
Satır sizin satırınızda yorumlanmışsa php.ini, muhtemelen php.ini'nin geliştirme yapılandırmasını kullanıyorsunuzdur.
BadHorsie

13

WAMP kullanıyorsanız ...

Eklemek veya özelliği yorumsuz gerektiğini always_populate_raw_post_datade php.inive onun değerini -1. Benim durumumda php.ini:

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

..ama hala uyarıyı alıyorsanız (benim gibi)

Ayrıca belirlesin always_populate_raw_post_data = -1içinde phpForApache.ini:

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

Bu dosyayı bulamazsanız, bir tarayıcı penceresi açın ve şu adrese gidin:

http://localhost/?phpinfo=1

ve Yüklü Yapılandırma Dosyası anahtarının değerini arayın . Benim durumumda, php.iniWAMP tarafından kullanılan şu konumdadır:

C:\wamp64\bin\apache\apache2.4.23\bin\php.ini (C: \ wamp64 \ bin \ php \ php5.6.25 \ phpForApache.ini'ye sembolik bağlantı)

Son olarak WAMP'ı yeniden başlatın (veya tüm hizmetleri yeniden başlat'ı tıklayın)


6

Eğer .htaccessdosya avilable değil kök klasörü ve bu kod satırında geçen oluşturun.

Bunu .htaccessdosyaya koyun (API için iyi çalıştığı test edilmiştir)

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

2
lütfen açıklayın Lordum
Zohaib

5

Yorumsuz

always_populate_raw_post_data = -1 

php.ini'de (satır # 703) ve APACHE hizmetlerini yeniden başlatmak mesajdan yine de kurtulmama yardımcı oluyor

; 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

Kabul edilen cevabın önerdiği gibi php.init'i değiştirdikten sonra hala bu sorunla mücadele eden herkes için. Hata, POSTherhangi bir parametre olmadan bir ajax dilekçesi yapıldığında ortaya çıktığından, yapmanız gereken tek şey gönderme yöntemini olarak değiştirmektir GET.

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

Yöntemi POSTherhangi bir nedenle saklamak istiyorsanız yine de başka bir seçenek , ajax petititonuna boş bir JSON nesnesi eklemektir.

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

4

Bir html formundan veri gönderirken bu hata mesajını aldım (Post yöntemi). Tek yapmam gereken, formdaki kodlamayı "metin / düz" den "application / x-www-form-urlencoded" veya "multipart / form-data" olarak değiştirmekti. Hata mesajı çok yanıltıcıydı.


3

Maalesef, @EatOng tarafından verilen bu cevap doğru değil . Cevabını okuduktan sonra, hatanın hiçbir zaman görünmediğinden emin olmak için ateşlediğim her AJAX isteğine (bazılarında zaten bazı alanlar olsa bile) bir kukla değişken ekledim.

Ama şu anda PHP'de aynı lanet olası hatayla karşılaştım. Bazı POST verilerini gönderdiğimi iki kez doğruladım (kukla değişkenle birlikte diğer bazı alanlar da). PHP sürümü 5.6.25, always_populate_raw_post_datadeğer şu şekilde ayarlandı:0 .

Ayrıca, bir application/jsonistek gönderirken , PHP onu doldurmuyor, bunun $_POSTyerine json_decode(), tarafından erişilebilen ham POST istek gövdesine ihtiyacım var php://input.

@ Rr- cites'in yanıtı,

0 / kapalı / ne olursa olsun: BC davranışı ( içerik türü kayıtlı değilse veya istek yöntemi POST'tan farklıysa doldurun ).

İstek yöntemi kesin olarak POST olduğundan, PHP'nin isteğimi tanımadığını / beğenmediğini tahmin ediyorum Content-Type: application/json(yine, neden ??).

SEÇENEK 1:

Düzenleme php.inidosya elle ve suçlu değişkeni ayarlamak-1 cevapların birçoğu burada önerdiği gibi.

SEÇENEK 2:

Bu bir PHP 5.6 hatasıdır. PHP'yi yükseltin.

SEÇENEK 3:

@ User9541305'in burada yanıtladığı gibi Content-Type, AJAX isteğinin değiştirilmesi application/x-www-form-urlencodedveya multipart/form-dataPHP'nin POSTed gövdeden doldurulmasını sağlayacaktır $_POST(çünkü PHP bu content-typebaşlıkları sever / tanır !?).

SEÇENEK 4: SON RESORT

AJAX'ı değiştirmek istemedim Content-Type, hata ayıklama için çok fazla soruna neden olur. (Chrome DevTools, JSON isteklerinin POSTed değişkenlerini güzel bir şekilde görüntüler.)

Bu şeyi bir istemci için geliştiriyorum ve onlardan en son PHP'yi kullanmalarını veya php.ini dosyasını düzenlemelerini isteyemiyorum. Son çare olarak, ayarlanıp ayarlanmadığını kontrol edeceğim 0ve eğer öyleyse,php.ini dosyayı PHP betiğimde . Elbette kullanıcıdan apache'yi yeniden başlatmasını istemem gerekecek. Ne utanç!

İşte örnek bir kod:

<?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

Peki, paylaşılan bir barındırma üzerinde php.inidosyaya erişimi olmayan biri varsa, bu kod satırını PHP dosyalarınızın en üstüne ayarlayabilirsiniz:

ini_set('always_populate_raw_post_data', -1);

Daha çok aynı şekilde çalışır. Umarım birisine hata ayıklama süresi kazandırır :)


0

NB: PHPSTORM KULLANIYORSANIZ görüntü açıklamasını buraya girin


Bu sorunu çözmek için bir saat harcadım, bunun benim php sunucu sorunum olduğunu düşünerek, php.ini'de 'always_populate_raw_post_data''-1' olarak ayarladım ve hiçbir şey işe yaramadı.

PhpStorm yerleşik sunucuyu kullanmanın, buradaki cevapta ayrıntılı olarak açıklanan soruna neden olduğunu öğrenene kadar: LazyOne Tarafından Cevap Burada , Bu yüzden paylaşmayı düşündüm.


-1

; php.init içinde always_populate_raw_post_data = -1 bu satırın açıklamasını kaldır .. always_populate_raw_post_data = -1


4
açıklar mısın? neden ? Ayrıca, yayınınızı doğru şekilde biçimlendirin / girintileyin.
Ravi

-1

Bu sorunun çözümünü bir arkadaşımdan aldım. dedi: Add ob_start (); oturum kodunuzun altında. Exit () ekleyebilirsiniz; başlığın altında. Ben denedim ve işe yaradı. Bu yardımcı olur umarım

Bu, php.init dosyasına erişimi olmayan, kiralanmış bir Hosting sunucusunda olanlar içindir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.