Laravel Response :: json()耗尽内存

时间:2016-05-05 10:49:37

标签: php json laravel laravel-4.2

我有一个应用程序,有时会返回大量的HTML;在这种情况下,我必须返回一个大表,内存耗尽。

我有一个宏设置,它检查要返回的数据是否不大于允许的json限制;

Response::macro('jsonWithValidation', function($response) {
    if(strlen(serialize($response)) > 125000000)
        $response = array(
            'status' => 200,
            'execute_also' => array(
                'notify("warning", "Data too large to be sent over json");'
            )
        );

    return Response::json($response, $response['status']);
});

这个剧本充当魅力;我现在面临的问题是最后Response::json耗尽内存。这意味着我的响应不会太大而无法通过json发送,但是Laravel方法(我运行的Laravel 4.2)会崩溃一切。

理想情况下,在代码的这一点上我可以有两个选项:

  • 使用基本的php发送所有内容,但我相信Laravel功能已经非常基本了
  • 清除我不需要回复的记忆

理想情况下我想使用第二个选项,但我不知道是否可以这样做...所以我该怎么办才能避免超出内存限制?

编辑: 这是我得到的错误

[05-May-2016 14:19:42 Europe/Rome] PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 64 bytes) in C:\wamp\www\project_ski\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php on line 446

2 个答案:

答案 0 :(得分:0)

我不确定。如果您认为记忆只是问题,那么请根据您的回答大小设置内容长度。

    $response = Response::make($contents, $response['status']);
    $response->header('Content-Length', strlen(serialize($response));
    $response->header('Content-Type', 'json');

return $response;

答案 1 :(得分:0)

这个json大小限制的本质究竟是什么,为什么你觉得它需要实现?

serialize()不会生成json数据,因此您甚至不会检查您声称的相同内容。而且,你正在运行两次相同的繁重操作。

更好的方法是这样的:

Response::macro('jsonWithValidation', function($response) {

    $return = Response::json($response, $response['status']);

    if(strlen($return) > 125000000)
        $return = array(
            'status' => 200,
            'execute_also' => array(
                'notify("warning", "Data too large to be sent over json");'
            )
        );

    return $return;
});

此外,如果您返回错误,http状态代码不应该是200 OK。更多信息:http://www.restapitutorial.com/httpstatuscodes.html