2013-05-09 12 views
10

Ich bin ein RESTS wie Service in PHP bauen, die eine große JSON Post als Hauptdaten annehmen sollte (ich senden und die Daten ähnlich wie hier diskutiert lesen: http://forums.laravel.io/viewtopic.php?id=900)Achtung: Eingangsvariablen überschritten 1000

Das Problem ist, dass PHP mir folgende Warnung gibt:

<b>Warning</b>: Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in <b>Unknown</b> on line <b>0</b><br /> 

gibt es eine Möglichkeit PHP Eingangsvariablen nicht zu bekommen zählen (oder sollte nur surpress Start Warnungen I)?

+3

Warum nicht 'max_input_vars' ändern, wie die Warnung empfiehlt? –

+0

Da mir die Idee, sie zu ändern, nicht gefällt, könnten meine geposteten JSON-Daten sehr groß sein. Ich brauche keine Hilfe von PHP, um meine Variablen zu analysieren, da ich keine Variablen sende, nur JSON-codierte Daten. –

+2

PHP ist es egal, dass Sie JSON verwenden. Die Daten werden als Eingangsvariablen gezählt, sodass die Warnung ausgelöst wird. Welche Nachteile sehen Sie, wenn Sie die Konfigurationsoption so verwenden, wie sie beabsichtigt war? –

Antwort

7

Ich fand heraus, dass der richtige Weg, um JSON-Daten direkt in PHP (über file_get_contents('php://input')) zu behandeln, sicherstellen, dass die Anfrage den richtigen Inhaltstyp, d. H. Content-type: application/json in der HTTP-Anfrage-Header.

In meinem Fall bin ich Ihr Interesse an Seiten von php curl mit mit diesem Code:

function curl_post($url, array $post = NULL, array $options = array()) { 
    $defaults = array(
    CURLOPT_POST => 1, 
    CURLOPT_HEADER => 0, 
    CURLOPT_URL => $url, 
    CURLOPT_FRESH_CONNECT => 1, 
    CURLOPT_RETURNTRANSFER => 1, 
    CURLOPT_FORBID_REUSE => 1, 
    CURLOPT_TIMEOUT => 600 
); 
    if(!is_null($post)) 
    $defaults['CURLOPT_POSTFIELDS'] = http_build_query($post); 
    $ch = curl_init(); 
    curl_setopt_array($ch, ($options + $defaults)); 
    if(($result = curl_exec($ch)) === false) { 
    throw new Exception(curl_error($ch) . "\n $url"); 
    } 
    if(curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200) { 
    throw new Exception("Curl error: ". 
     curl_getinfo($ch, CURLINFO_HTTP_CODE) ."\n".$result . "\n"); 
    } 
    curl_close($ch); 
    return $result; 
} 

$curl_result = curl_post(URL, NULL, 
    array(CURLOPT_HTTPHEADER => array('Content-Type: application/json'), 
     CURLOPT_POSTFIELDS => json_encode($out)) 
    ); 

die CURLOPT_HTTPHEADER => array('Content-Type: application/json') Teil beachten Sie.

Auf der Empfangsseite verwende ich den folgenden Code:

$rawData = file_get_contents('php://input'); 
$postedJson = json_decode($rawData,true); 
if(json_last_error() != JSON_ERROR_NONE) { 
    error_log('Last JSON error: '. json_last_error(). 
    json_last_error_msg() . PHP_EOL. PHP_EOL,0); 
} 

nicht die max_input_vars Variable ändern Sie. Seit die Anfrage geändert wurde, um richtige Header zu setzen, ging mein Problem mit max_input_vars weg. Offenbar bewertet PHP die Post-Variablen nicht mit bestimmten Content-type gesetzt ist.

4

Nach php manualmax_input_vars in php.ini Rolle ist:

Wie viele Eingangsvariablen angenommen werden können (Grenze zu $_GET angewendet wird, $_POST und $_COOKIE Superglobal separat). Die Verwendung dieser Direktive mildert die Möglichkeit von Denial-of-Service-Angriffen, die Hash-Kollisionen verwenden. Wenn mehr Eingangsvariablen als in dieser Richtlinie angegeben definiert sind, wird eine E_WARNING ausgegeben, und weitere Eingangsvariablen sind abgeschnitten von der Anfrage. Dieser Grenzwert gilt nur für jede Verschachtelungsebene eines mehrdimensionalen Eingabearrays.

Sie müssen nur max_input_vars in Ihrer php.ini eine größere Nummer zuweisen.

+0

Also, da ich nicht wirklich vorhersagen kann, wie lange meine JSON-Daten sein werden, sollte ich das auf unendlich ändern !? Wäre es besser, meine JSON als POST-Var (wie beim Hochladen einer Datei in PHP) einzureichen? –

+0

Auch wenn Sie es in einer POST-Variable senden, müssen Sie es schließlich analysieren und Sie müssen mehr Variablen erstellen (es sei denn, Sie verarbeiten ganze JSON-Zeichenfolge und nichts mehr). Es ist ziemlich selten, dass Sie nicht wissen, wie lange ein JSON-Objekt sein kann, aber in dieser Situation können Sie es entweder in "INF" oder etwas sehr Großes ändern. Vorsicht vor DoS! – Mateusz

1

Ändern max_input_vars in php.ini nicht für mich gearbeitet

ändern max_input_vars .htaccess-Datei funktioniert.

Wenn Sie die "max_input_vars" mit der .htaccess-Datei ändern möchten, gehen Sie zu C: \ xampp \ apache \ conf \ httpd.conf-Datei (in xampp) fügen Sie den folgenden Code in Ihre .htaccess-Datei ein.

php_value max_input_vars 10000

4

Realy, ändern max_input_vars mit .htaccess Datei funktioniert, aber Sie müssen Apache-Dienst neu zu starten.

Folgen Sie den kompletten Prozess:

  1. Zum C:\xampp\apache\conf\httpd.conf
  2. Datei öffnen httpd.conf
  3. In Datei sucht xampp/htdocs
  4. etwas niedriger, können Sie eine Zeile wie diese: AllowOverride
  5. Wenn diese Zeile vor AllowOverride zeigt, löschen Sie die
  6. nächste Zeile nach AllowOverride einfügen php_value max_input_vars 10000
  7. Speichern Sie die Datei und schließen
  8. Schließlich wird der Apache und Restart STOP (Es funktioniert nur nach Apache Neustart)
8

etwas nicht in Ordnung ist, müssen Sie 1000 nicht brauchen Variablen. Recode dein Programm, um 1 variables Array mit 1000 Schlüsseln zu akzeptieren.Dies ist ein Fehler, der Sie warnt, dass Sie die Dinge nicht auf die empfohlene Weise tun. Deaktivieren Sie es nicht, erweitern Sie es nicht oder verstecken Sie es in keiner Weise.

Verwandte Themen