Cảnh báo về việc `$ HTTP_RAW_POST_DATA` không được dùng nữa


121

Tôi đã chuyển sang PHP 5.6.0 và bây giờ tôi nhận được cảnh báo sau ở mọi nơi:

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

Tốt thôi, tôi dựa vào một số tính năng không dùng nữa. Ngoại trừ việc tôi không!

  1. Tôi chưa bao giờ sử dụng biến này trong bất kỳ tập lệnh nào của mình. Thành thật mà nói, tôi không biết nó thậm chí còn tồn tại.
  2. phpinfo()cho thấy rằng tôi đã always_populate_raw_post_datađặt thành 0 (bị vô hiệu hóa). Vậy chuyện gì đang xảy ra thế?

Tôi không muốn "tránh cảnh báo" bằng cách đặt giá trị này thành -1. Điều này sẽ chỉ ẩn cảnh báo và tôi vẫn sẽ có cấu hình không dùng nữa. Tôi muốn giải quyết vấn đề tại nguồn của nó và biết lý do tại sao PHP nghĩ rằng việc điền đầy đủ HTTP_RAW_POST_DATAđược bật.


Cùng một vấn đề, nhưng có thể có nguyên nhân / giải pháp khác nhau: stackoverflow.com/questions/25984623/…
rr-

Cảnh báo này khiến tôi gặp rắc rối khi chạy xử lý của PHP SoapServer () trên PHP> = 5.6. Cảnh báo này sẽ luôn được gửi đi trong phản hồi của SOAP, do đó __soapCall () của SoapClient sẽ nhận được "ngoại lệ SoapFault: [Khách hàng] có vẻ như chúng tôi không có tài liệu XML". Rất khó để gỡ lỗi vì cảnh báo này thường sẽ không hiển thị.
Johnny Wong

Câu trả lời:


135

Nó chỉ ra rằng sự hiểu biết của tôi về thông báo lỗi là sai. Tôi muốn nói rằng nó có tính năng lựa chọn từ ngữ rất kém. Googling xung quanh cho tôi thấy ai đó đã hiểu nhầm thông báo giống hệt như tôi đã làm - hãy xem lỗi PHP # 66763 .

Sau khi hoàn toàn vô ích "Đây là cách mà các RM muốn nó trở thành." Khi Mike trả lời lỗi đó, Tyrael giải thích rằng việc đặt nó thành "-1" không làm cho cảnh báo biến mất. Nó làm đúng , tức là nó hoàn toàn vô hiệu hóa việc điền biến thủ phạm. Hóa ra rằng việc đặt nó thành 0 VẪN điền dữ liệu trong một số trường hợp. Nói về thiết kế xấu! Để trích dẫn PHP RFC :

Thay đổi cài đặt always_populate_raw_post_data INI để chấp nhận ba giá trị thay vì hai giá trị.

  • -1: Hành vi của chủ nhân; đừng bao giờ điền $ GLOBALS [HTTP_RAW_POST_DATA]
  • 0 / off / anything: BC hành vi (điền nếu loại nội dung chưa được đăng ký hoặc phương thức yêu cầu khác với POST)
  • 1 / on / yes / true: BC hành vi (luôn điền $ GLOBALS [HTTP_RAW_POST_DATA])

Vì vậy, đặt nó thành -1 không chỉ tránh cảnh báo, như thông báo đã nói, mà cuối cùng nó cũng vô hiệu hóa việc điền biến này, đó là điều tôi muốn.


23
tl; dr đây là một cảnh báo ngu ngốc xuất hiện ngay cả khi bạn không sử dụng thứ mà nó cảnh báo; đặt always_populate_raw_post_data thành -1
srcspider

7
tôi đã thiết lập nó always_populate_raw_post_data = -1. Bây giờ vẫn còn cảnh báo đến và làm hỏng phản hồi json
itsazzad

2
Vì vậy, câu trả lời có hiệu lực là truy cập php.initệp của bạn và đặt (hoặc bỏ ghi chú) always_populate_raw_post_data = -1.
John

Nhưng tôi không thực sự hiểu được vấn đề. Đó chính xác là những gì cảnh báo đang nói? To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.
Andreas

@Andreas chính là lý do tại sao nó nói như vậy, tức là sự khác biệt giữa 0, rõ ràng là "bị vô hiệu hóa", và -1, là ... "bị vô hiệu hóa mạnh hơn"? → nhầm lẫn → lý do cho câu hỏi này (và câu trả lời).
rr-

39

Đã được một thời gian cho đến khi tôi gặp lỗi này. Đưa ra câu trả lời của tôi cho bất kỳ ai có thể vấp phải vấn đề này.

Lỗi chỉ có nghĩa là bạn đang gửi một yêu cầu POST trống. Lỗi này thường thấy trên HTTPRequests không có tham số nào được truyền. Để tránh lỗi này, bạn luôn có thể thêm một tham số vào POST mà không cần thay đổi php.ini.

Giống:

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

4
Đây là câu trả lời tốt nhất mà tôi đã tìm thấy cho vấn đề này! Tôi đã giải quyết vấn đề này liên tục trong một tháng và nó đã khiến tôi nhìn sai hướng. Tôi chỉ đơn giản là có một BÀI ĐĂNG trống do tai nạn và khi điều đó đã được sửa, mọi thứ đều hoạt động tốt! Cảm ơn bạn đã cứu tôi khỏi một cơn đau đầu khủng khiếp!
Craig Howell

34

Tôi đã gặp vấn đề tương tự trên máy chủ nginx (DigitalOcean) - tất cả những gì tôi phải làm là đăng nhập rootvà sửa đổi tệp /etc/php5/fpm/php.ini.

Để tìm dòng với always_populate_raw_post_datalần chạy đầu tiên tôi grep:

grep -n 'always_populate_raw_post_data' php.ini

Điều đó trả lại dòng 704

704:;always_populate_raw_post_data = -1

Sau đó, chỉ cần mở php.initrên dòng đó bằng vitrình chỉnh sửa:

vi +704 php.ini

Bỏ dấu chấm phẩy để bỏ ghi chú và lưu tệp :wq

Cuối cùng khởi động lại máy chủ và lỗi đã biến mất.


3
Nếu dòng được nhận xét trong php.inibạn có thể bạn đang sử dụng cấu hình phát triển của php.ini.
BadHorsie

13

Nếu bạn đang sử dụng WAMP ...

bạn nên thêm hoặc bỏ ghi chú thuộc tính always_populate_raw_post_datavào php.inivà đặt giá trị của nó thành -1. Trong trường hợp của tôi php.ininằm ở:

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

..nhưng nếu bạn vẫn nhận được cảnh báo (như tôi đã từng)

Bạn cũng nên đặt always_populate_raw_post_data = -1trong phpForApache.ini:

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

Nếu bạn không thể tìm thấy tệp này, hãy mở cửa sổ trình duyệt và truy cập:

http://localhost/?phpinfo=1

và tìm kiếm giá trị của khóa Tệp cấu hình đã tải . Trong trường hợp của tôi, php.iniWAMP được sử dụng nằm ở:

C:\wamp64\bin\apache\apache2.4.23\bin\php.ini (liên kết tượng trưng với C: \ wamp64 \ bin \ php \ php5.6.25 \ phpForApache.ini)

Cuối cùng khởi động lại WAMP (hoặc nhấp vào khởi động lại tất cả các dịch vụ)


6

Nếu .htaccesstệp không có sẵn, hãy tạo nó trên thư mục gốc và dán dòng mã này.

Đưa cái này vào .htaccesstệp (đã kiểm tra hoạt động tốt cho API)

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

2
xin giải thích My Lord
zohaib

5

Bỏ chú thích

always_populate_raw_post_data = -1 

trong php.ini (dòng # 703) và việc khởi động lại dịch vụ APACHE vẫn giúp tôi thoát khỏi thông báo

; 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

Đối với bất kỳ ai vẫn gặp khó khăn với vấn đề này sau khi thay đổi php.init như câu trả lời được chấp nhận cho thấy. Vì lỗi xảy ra khi một kiến ​​nghị ajax được thực hiện thông qua POSTmà không có bất kỳ tham số nào, tất cả những gì bạn phải làm là thay đổi phương thức gửi thành GET.

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

Vẫn còn một tùy chọn khác nếu bạn muốn giữ phương thức này POSTvì bất kỳ lý do gì là thêm một đối tượng JSON trống vào ajax smalltiton.

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

4

Tôi nhận được thông báo lỗi này khi gửi dữ liệu từ biểu mẫu html (Phương pháp đăng). Tất cả những gì tôi phải làm là thay đổi mã hóa trong biểu mẫu từ "văn bản / thuần túy" thành "ứng dụng / x-www-form-urlencoded" hoặc "đa phần / biểu mẫu-dữ liệu". Thông báo lỗi rất dễ gây hiểu lầm.


2

Thật không may, câu trả lời này ở đây của @EatOng là không đúng . Sau khi đọc câu trả lời của anh ấy, tôi đã thêm một biến giả vào mọi yêu cầu AJAX mà tôi đang kích hoạt (ngay cả khi một số trong số chúng đã có một số trường) chỉ để đảm bảo lỗi không bao giờ xuất hiện.

Nhưng vừa rồi tôi đã gặp phải lỗi tương tự từ PHP. Tôi đã xác nhận lại rằng tôi đã gửi một số dữ liệu POST (một số trường khác cũng như biến giả). Phiên bản PHP 5.6.25, always_populate_raw_post_datagiá trị được đặt thành 0.

Ngoài ra, khi tôi đang gửi một application/jsonyêu cầu, PHP không đưa nó vào $_POST, thay vào đó tôi phải đến json_decode()phần thân yêu cầu POST thô, có thể truy cập bằng php://input.

Như câu trả lời của @ rr- cites,

0 / off / anything: Hành vi BC (điền nếu loại nội dung chưa được đăng ký hoặc phương thức yêu cầu không phải là POST ).

Bởi vì phương thức yêu cầu chắc chắn là POST, tôi đoán PHP đã không nhận ra / thích Content-Type: application/jsonyêu cầu của tôi (một lần nữa, tại sao ??).

LỰA CHỌN 1:

Chỉnh sửa php.initệp theo cách thủ công và đặt biến thủ phạm thành -1, như nhiều câu trả lời ở đây đề xuất.

LỰA CHỌN 2:

Đây là một lỗi PHP 5.6. Nâng cấp PHP.

LỰA CHỌN 3:

Như @ user9541305 đã trả lời ở đây, việc thay đổi Content-Typeyêu cầu AJAX thành application/x-www-form-urlencodedhoặc multipart/form-datasẽ làm cho PHP điền vào $_POSTtừ phần thân POSTed (vì PHP thích / nhận ra những content-typetiêu đề đó !?).

LỰA CHỌN 4: RESORT CUỐI CÙNG

Tôi không muốn thay đổi Content-TypeAJAX, nó sẽ gây ra rất nhiều rắc rối cho việc gỡ lỗi. (Công cụ dành cho nhà phát triển của Chrome xem tốt các biến ĐÃ ĐĂNG của các yêu cầu JSON.)

Tôi đang phát triển thứ này cho một khách hàng và không thể yêu cầu họ sử dụng PHP mới nhất, cũng như chỉnh sửa tệp php.ini. Phương án cuối cùng, tôi sẽ chỉ kiểm tra xem nó có được đặt thành không 0và nếu có, hãy chỉnh sửa php.initệp trong chính tập lệnh PHP của tôi. Tất nhiên tôi sẽ phải yêu cầu người dùng khởi động lại apache. Xấu hổ làm sao!

Đây là một mã mẫu:

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

Chà, nếu có ai đó trên một máy chủ lưu trữ được chia sẻ và không có quyền truy cập vào php.initệp, bạn có thể đặt dòng mã này ở đầu tệp PHP của mình:

ini_set('always_populate_raw_post_data', -1);

Hoạt động giống nhau hơn. Tôi hy vọng nó tiết kiệm cho ai đó một số thời gian gỡ lỗi :)


0

NB: NẾU BẠN ĐANG SỬ DỤNG PHPSTORM nhập mô tả hình ảnh ở đây


Tôi đã dành một giờ để giải quyết vấn đề này, nghĩ rằng đó là sự cố máy chủ php của tôi, Vì vậy, tôi đặt 'always_populate_raw_post_data' thành '-1' trong php.ini và không có gì hoạt động.

Cho đến khi tôi phát hiện ra rằng việc sử dụng máy chủ phpStorm được tích hợp sẵn là nguyên nhân gây ra sự cố như được nêu chi tiết trong câu trả lời ở đây: Trả lời của LazyOne Đây , vì vậy tôi đã nghĩ đến việc chia sẻ nó.


-1

; always_populate_raw_post_data = -1 trong php.init xóa nhận xét của dòng này .. always_populate_raw_post_data = -1


4
bạn có thể giải thích?? tại sao ? Ngoài ra, hãy định dạng / thụt lề bài viết của bạn đúng cách.
Ravi

-1

Tôi vừa nhận được giải pháp cho vấn đề này từ một người bạn. anh ấy nói: Thêm ob_start (); dưới mã phiên của bạn. Bạn có thể thêm exit (); dưới tiêu đề. Tôi đã thử và nó đã hoạt động. Hi vọng điêu nay co ich

Điều này dành cho những người sử dụng máy chủ Hosting thuê không có quyền truy cập vào tệp php.init.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.