2014-10-31 20 views
10

Gần đây tôi đã nâng cấp máy chủ sản xuất của tôi để Ubuntu 14.04 và PHP 5.6, và bây giờ tôi nhận được cảnh báo trong bản ghi lỗi của tôi:

2014/10/31 10:42:45 [error] 17128#0: *46238 FastCGI sent in stderr: "PHP message: PHP 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" while reading response header from upstream, client: 24.123.216.42, server: example.com, request: "POST /api/notes HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "example.com", referrer: "https://example.com/admin/"

tôi read the documentation cũng như câu hỏi có vẻ liên quan này: Undefined variable: HTTP_RAW_POST_DATA. Tuy nhiên, tôi không thể tìm ra lý do tại sao thông báo này được ghi lại. Theo như tôi có thể nói, tôi không sử dụng $HTTP_RAW_POST_DATA ở bất kỳ nơi nào trong codebase của mình. Tôi đã thử:

find . -exec grep "HTTP_RAW_POST_DATA" {} \; -print 2>/dev/null 

từ thư mục gốc của dự án của tôi (bao gồm tất cả thư mục của nhà cung cấp), nhưng tôi không tìm thấy bất kỳ kết quả phù hợp nào.

I read more about always_populate_raw_post_data và có vẻ như chỉ $HTTP_RAW_POST_DATA chỉ được điền nếu tham số always_populate_raw_post_data được đặt thành TRUE. Tôi đã kiểm tra phpinfo() tôi và các tham số được thiết lập để 0.

Nếu tôi không rõ ràng gọi $HTTP_RAW_POST_DATAalways_populate_raw_post_data được thiết lập để 0, tại sao tôi lại nhận được những thông báo này trong nhật ký lỗi của tôi? Thiết lập always_populate_raw_post_data thành -1 làm gì?

+1

Có thể nó được chôn trong tệp cấu hình của máy chủ. –

+0

Tôi đã nghĩ về điều đó. Tôi chạy một 'find/etc/nginx -exec grep" always_populate_raw_post_data "{} \; -print 2>/dev/null' không có kết quả. Ngoài ra, nó hiển thị là '0' trong' phpinfo() '. –

+0

Bạn biết khoan, tạo mã tối thiểu để tái tạo vấn đề. –

Trả lời

9

Dưới đây là the relevant C code với ý kiến ​​của tôi:

static zend_bool populate_raw_post_data(TSRMLS_D) 
{ 
    // not a post, empty request - return FALSE 
    if (!SG(request_info).request_body) { 
     return (zend_bool) 0; 
    } 

    // if always_populate_raw_post_data=0 then 
    // if we don't know how to parse the post (unknown mimetype) return TRUE 
    // otherwise (known mimetype) return FALSE 
    if (!PG(always_populate_raw_post_data)) { 
     return (zend_bool) !SG(request_info).post_entry; 
    } 

    // if always_populate_raw_post_data > 0 return TRUE 
    // if always_populate_raw_post_data < 0 return FALSE 
    return (zend_bool) (PG(always_populate_raw_post_data) > 0); 
} 

Đó là, thiết lập always_populate_raw_post_data đến 0 vẫn cho phép điền vào các loại nội dung không xác định. Bạn phải sử dụng giá trị âm để bỏ qua nó hoàn toàn.

này bây giờ là documented trong cuốn hướng dẫn:

Phương pháp thuận lợi nhất để truy cập dữ liệu POST liệu là php: // đầu vào, và $ HTTP_RAW_POST_DATA bị phản đối trong PHP 5.6.0 trở đi. Việc đặt always_populate_raw_post_data thành -1 sẽ chọn tham gia vào hành vi mới sẽ được triển khai trong phiên bản PHP tương lai, trong đó $ HTTP_RAW_POST_DATA không bao giờ được xác định.

+0

Tôi xin lưu ý rằng việc đặt 'auto_populate_raw_post_data' thành' -1' không có trong tài liệu hôm qua! –

+0

Có, có vẻ như ghi chú đã được thêm vào để phản hồi báo cáo lỗi deW1 được đề cập. – georg

+0

có phải mất một lúc để tài liệu cập nhật tôi đoán và bạn không đủ may mắn để kiểm tra điều này sau 1 ngày :) – deW1

4

Nó đã được nộp như một bug report

Cũng đọc this.

Về cơ bản, thay đổi giá trị thành -1 và điều đó sẽ khắc phục "sự cố" của bạn.

Ngoài ra hãy chắc chắn rằng bạn sử dụng php://input đọc thêm dưới đây V

Tôi nghĩ rằng nó sẽ được tốt hơn để mô tả những gì đang thực sự xảy ra: các E_DEPRECATED sẽ được tạo ra khi $ HTTP_RAW_POST_DATA là dân cư mà điều khiển bởi giá trị của always_populate_raw_post_data (liên kết đến http://php.net/manual/en/ini.core.php nơi chúng tôi đã mô tả trong trường hợp nào sẽ $ HTTP_RAW_POST_DATA được điền) và xóa thông báo không được dùng nữa. vô hiệu hóa dân số $ HTTP_RAW_POST_DATA qua cài đặt always_populate_raw_post_data thành -1, sẽ xóa E_DEPRECATED.

từ http://php.net/manual/en/ini.core.php:

Nếu đặt là TRUE, PHP sẽ luôn cư $ HTTP_RAW_POST_DATA chứa dữ liệu POST thô. Nếu không, biến được điền chỉ khi loại dữ liệu MIME không được nhận dạng.

Phương thức ưa thích để truy cập dữ liệu POST thô là php: // input và $ HTTP_RAW_POST_DATA không còn được dùng trong PHP 5.6.0 trở đi. Đặt always_populate_raw_post_data thành -1 sẽ chọn tham gia hành vi mới sẽ được triển khai trong phiên bản PHP trong tương lai, trong đó $ HTTP_RAW_POST_DATA không bao giờ được xác định.


Changes để PHP-5.6

Tái sử dụng được, optioanlly JITty khởi php: // đầu vào dòng Change always_populate_raw_post_data thiết lập INI để chấp nhận ba giá trị thay vì hai.

-1: Hành vi của chủ; đừng bao giờ cư $ GLOBALS [HTTP_RAW_POST_DATA]

0/tắt/bất cứ điều gì: BC hành vi (cư nếu content-type không phải là đăng ký hoặc yêu cầu phương pháp là khác hơn POST)

1/on/có/đúng: hành vi BC (luôn luôn cư $ GLOBALS [HTTP_RAW_POST_DATA])

+0

Thay đổi giá trị thành -1 sẽ khắc phục sự cố. – Morgan

Các vấn đề liên quan