2016-05-05 4 views
1

Ich habe eine Anwendung, die manchmal Stücke von HTML zurückgibt; In diesem Fall muss ich einen großen Tisch zurückgeben und der Speicher ist erschöpft.Laravel Response :: json() erschöpft Speicher

Ich habe ein Makro eingerichtet, das überprüft, dass die Daten zurückgeben nicht größer als die zulässige JSON-Grenze ist;

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']); 
}); 

Dieses Skript funktioniert als ein Charme; Das Problem, dem ich jetzt gegenüberstehe, ist, dass die letzten Response::json Auspuff Speicher. Das bedeutet, dass meine Antwort nicht zu groß ist, um über Json gesendet zu werden, aber die Laravel-Methode (ich benutze Laravel 4.2) stürzt alles ab.

Idealerweise an dieser Stelle des Code, den ich zwei Möglichkeiten haben könnte:

  • senden alles mit grundlegenden php, aber ich glaube,
  • klar, dass die Speicher die Laravel Funktion ist ziemlich einfach schon werde ich nicht muß für die Antwort

im Idealfall würde ich mag die zweite Option verwenden, aber ich habe keine Ahnung, ob dies geschehen könnte ... so was soll ich tun, um zu vermeiden Speicherlimit überschreiten?

EDIT: Dies ist der Fehler, den ich

bekommen
[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

Sie machen einen Scheck, aber generieren JSON trotzdem! Mach es einfach nicht, wenn der Check fehlschlägt. –

Antwort

0

Ich bin nicht sicher. Wenn Sie der Meinung sind, dass Speicher nur in Ihrem Fall ein Problem darstellt, legen Sie eine Inhaltslänge fest, die auf Ihrer Antwortgröße basiert.

0

Was genau ist das Wesen dieser JSON-Größenbeschränkung, warum haben Sie das Gefühl, dass es implementiert werden muss?

serialize() generiert keine JSON-Daten, Sie überprüfen also nicht einmal das Gleiche, was Sie behaupten. Darüber hinaus führen Sie die gleiche schwere Operation zweimal aus.

Ein besserer Ansatz wäre so etwas wie dieses:

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; 
}); 

Auch, wenn Sie einen Fehler zurückgeben, HTTP-Statuscode sollte nicht 200 OK sein. Mehr hier: http://www.restapitutorial.com/httpstatuscodes.html