always_populate_raw_post_data - 无法从Backbone创建访问请求有效负载

lox*_*boi 7 php xmlhttprequest postdata slim backbone.js

我正在尝试使用Backbone.js将一个集合保存到我的数据库,并在我的服务器上运行SLIM php框架.

这是我的收藏:

var newUser = this.collection.create(
    formData,
    {
        wait: true,
        success: $.proxy(function() {
            this.collection.currentUser = newUser;
            App.Router.navigate('', { trigger: true });
        }, this)
    }
);
Run Code Online (Sandbox Code Playgroud)

这是我的SLIM路线:

$api->post('/users', function() use($api, $db) {

    $request = $api->request()->post();

    $api->response()->header('Content-Type', 'application/json');

    $result = $db->users()->insert($user);

    if( $result ) {
        echo json_encode(array(
            'id' => $result['id']
        ));
    }
    else {
        echo json_encode(array(
            'status' => false,
            'message' => 'error_creating_user'
        ));
    }

});

$api->run();
Run Code Online (Sandbox Code Playgroud)

在调用create()我的集合时,我在服务器的响应中收到了弃用警告:

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

我按照这些说明操作并完成了以下操作:

我在我的路线之前添加了这个:

ini_set('always_populate_raw_post_data', '-1');
Run Code Online (Sandbox Code Playgroud)

从我的POST路径中我尝试接收请求有效负载,如下所示:

$request = file_get_contents('php://input');
Run Code Online (Sandbox Code Playgroud)

在对我的代码进行此更改后,我得到的响应保持不变...

编辑

即使空回调,也会发生错误....

$api->post('/users', function() use($api, $db) {

    // nothing

});
Run Code Online (Sandbox Code Playgroud)

Mik*_*ola 24

PHP 5.6中存在一个错误.默认值always_populate_raw_post_data0.即使您的代码不使用,这也会导致PHP发出警告$HTTP_RAW_POST_DATA.有人声称header()在输出一些文字后打电话时会发生这种情况.尝试使用ini_set()并没有帮助.

您必须直接在php.ini中更改配置.

always_populate_raw_post_data = -1
Run Code Online (Sandbox Code Playgroud)

PHP内幕中的相关讨论.


HIL*_*EEN 5

基本上你可以Automatically populating $HTTP_RAW_POST_DATA is deprecated...通过几种方式解决错误,

  1. PHP 设置

将 always_populate_raw_post_data 更改为 -1 php.ini 文件将解决该问题。但是,当您没有足够的控制 php.ini 文件时,就会出现问题。您可以考虑共享主机。

  1. 阿帕奇设置

将 .htaccess 文件内部更改为您的应用程序目录。这将仅对您的应用程序进行隔离控制。它不会影响其他应用程序执行的 APACHE 和 PHP。

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

我会推荐第二种方法。因为它允许您将应用程序放置在共享托管和专用服务器托管中。