Je crée un service semblable à RESTS dans PHP qui devrait accepter une publication JSON volumineuse en tant que données principales (j'envoie et lis les données de la manière décrite ci-dessous: http://forums.laravel.io/viewtopic. php? id = 900 )
Le problème est que PHP me donne l'avertissement suivant:
<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 />
Existe-t-il un moyen d’obtenir que PHP ne compte pas les variables d’entrée (ou devrais-je simplement surpresser les avertissements de démarrage)?
J'ai découvert que la bonne façon de gérer les données JSON directement dans PHP (via file_get_contents('php://input')
) est de s'assurer que la demande définit le bon type de contenu, à savoir Content-type: application/json
dans l'en-tête de la requête HTTP.
Dans mon cas, je demande des pages de php en utilisant curl avec ce 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))
);
Notez la partie CURLOPT_HTTPHEADER => array('Content-Type: application/json')
.
Du côté de la réception, j'utilise le code suivant:
$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);
}
Ne changez pas la variable max_input_vars
. Depuis que la demande de définition des en-têtes de droite a été modifiée, mon problème avec max_input_vars
est parti. Apparemment, PHP n'évalue pas les variables de publication avec un certain Content-type
défini.
Quelque chose ne va pas, vous n'avez pas besoin de 1000 variables. Recodez votre programme pour accepter 1 tableau de variables avec 1000 clés. Cette erreur est là pour vous avertir que vous ne faites pas les choses de la manière recommandée. Ne le désactivez pas, ne le prolongez pas et ne le cachez pas.
Selon manuel phpmax_input_vars
dans php.ini
le rôle est:
Nombre de variables d'entrée pouvant être acceptées (la limite s'applique à
$_GET
,$_POST
et$_COOKIE
superglobal séparément). Utilisation de cette directive atténue la possibilité d'attaques par déni de service utilisant de la table de hachage les collisions. S'il y a plus de variables d'entrée que celles spécifiées par ceci directive, unE_WARNING
est émis et les autres variables d’entrée sont tronqué de la demande. Cette limite s'applique uniquement à chaque imbrication niveau d'un tableau d'entrée multidimensionnel.
Vous devez simplement attribuer un plus grand nombre à max_input_vars
dans votre php.ini
.
Réellement, changer max_input_vars
en utilisant .htaccess
fonctionne mais vous devez redémarrer le service Apache.
Suivez le processus complet:
C:\xampp\Apache\conf\httpd.conf
httpd.conf
xampp/htdocs
AllowOverride
#
avant AllowOverride
, supprimez le #
AllowOverride
insérer php_value max_input_vars 10000
Change ça
; max_input_vars = 1000
Pour ça
max_input_vars = 3000
La ligne de commentaire dans le fichier php.ini est
;
Changer max_input_vars dans php.ini n'a pas fonctionné pour moi
Changer max_input_vars à l'aide du fichier .htaccess fonctionne.
Si vous souhaitez modifier les “max_input_vars” à l'aide du fichier .htaccess, accédez au fichier C:\xampp\Apache\conf\httpd.conf (dans xampp), ajoutez le code suivant dans votre fichier .htaccess.
valeur_php max_input_vars 10000
Je pense que la plupart du temps, il n'est pas nécessaire d'augmenter la taille de max_input_vars
,
mais pour optimiser votre code,
j'avais fait face à ce problème en obtenant tous les résultats d'une requête ajax et en envoyant les résultats à une autre requête ajax.
Donc, ce que j'ai fait est stringified le tableau à partir des résultats de la base de données,
JSON.stringify(totalResults);
en javascript JSON.stringify
convertir un tableau en chaîne, donc après la conversion, j’envoie cette chaîne à une autre demande et décodé cette chaîne en tableau à nouveau en utilisant json_decode
dans php,
<?php $totalResults = json_decode($_POST['totalResults']); ?>
donc j'ai à nouveau ce tableau d'origine,
j'espère que cela peut aider quelqu'un alors je l'ai partagé, merci.