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

时间:2015-02-02 13:21:33

标签: php backbone.js xmlhttprequest slim postdata

我正在尝试使用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)
    }
);

这是我的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();

在我的收藏集上调用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');

并且在我的POST路由中,我试图像这样接收请求有效负载:

$request = file_get_contents('php://input');

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

修改

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

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

    // nothing

});

3 个答案:

答案 0 :(得分:24)

PHP 5.6中存在一个错误。 always_populate_raw_post_data的默认值为0。即使您的代码不使用$HTTP_RAW_POST_DATA,这也会导致PHP发出警告。有人声称在输出一些文本后调用header()时会发生这种情况。尝试使用ini_set()无济于事。

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

always_populate_raw_post_data = -1

PHP内部的相关discussion

答案 1 :(得分:2)

基本上,您可以通过多种方式解决sqoop-import错误,

  1. PHP SETTINGS
  2. 将always_populate_raw_post_data更改为-1 php.ini文件将解决此问题。但是,它成为你没有足够的控制php.ini文件的问题。你可以想到共享主机。

    1. APACHE SETTINGS
    2. 将.htaccess文件更改为应用程序目录。这将仅对您的应用程序进行独立控制。它既不会影响APACHE,也不会影响其他应用程序执行的PHP。

      Automatically populating $HTTP_RAW_POST_DATA is deprecated...

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

答案 2 :(得分:0)

您可以通过来自Slim的请求对象请求POST数据。

$api->post('/users', function() use ($api) {
    var_dump($api->request()->post());
    var_dump($api->request()->post('specificKey'));
});

以下是文档:http://docs.slimframework.com/#Request-Variables