2016-05-05 3 views
1

У меня есть приложение, которое иногда возвращает куски HTML; в этом случае я должен вернуть большую таблицу, и память исчерпается.Laravel Response :: json() исчерпывает память

У меня есть макрос, который проверяет, что возвращаемые данные не превышают допустимый предел 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 довольно простой уже
  • ясно память я не буду необходимо для ответа

в идеале я хотел бы использовать второй вариант, но я понятия не имею, если это можно было бы сделать ... так , что я должен сделать, чтобы избежать превышения лимита памяти?

EDIT: Это ошибка я получаю

[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 
+0

Вы делаете чек, но генерируете JSON в любом случае! Просто не делайте этого, если проверка не удалась. –

ответ

0

я не уверен. Если вы считаете, что память - это только проблема в вашем случае, то установите длину содержимого на основе вашего размера ответа.

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

return $response; 
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

Смежные вопросы