Maison  >  Article  >  développement back-end  >  Solution au problème selon lequel PHP ne peut pas modifier les informations d'en-tête

Solution au problème selon lequel PHP ne peut pas modifier les informations d'en-tête

不言
不言original
2018-07-23 16:17:492438parcourir

Lors de l'utilisation de PHP, vous pouvez parfois rencontrer des erreurs. Comment ces erreurs se produisent-elles ? Et comment résoudre ces problèmes ? Cela nécessite d’avoir une certaine maîtrise du langage PHP. Laissez-moi maintenant parler de la façon de résoudre le problème selon lequel PHP ne peut pas modifier les informations d'en-tête.

Par exemple, l'erreur suivante avertissant que PHP ne peut pas modifier les informations d'en-tête :

Avertissement : Impossible de modifier les informations d'en-tête - en-têtes déjà envoyés par

Nous venons de commencer à écrire des programmes PHP Parfois , vous avez peut-être rencontré ce problème. Littéralement, cela signifie :

Attention : les informations d'en-tête ne peuvent pas être modifiées - les en-têtes ont déjà été envoyés. . .

Alors, quelle est la raison pour laquelle PHP ne peut pas modifier les informations d'en-tête ?

C'est-à-dire lorsque nous avons du contenu de sortie avant la fonction header() ou setcookie(), tel que :

< ?PHP  
echo "hello";  
header("content-type:
    text/html;charset:utf-8");  
?>

Un avertissement apparaîtra dans le code ci-dessus !

Pourquoi y a-t-il une erreur d'avertissement s'il y a une sortie avant header et setcookie ? C'est facile à comprendre si vous comprenez le processus de traitement de PHP !

Alors, comment PHP gère-t-il le fait que PHP ne peut pas modifier les informations d'en-tête ?

Lorsque le script a une sortie (première sortie), PHP enverra d'abord les informations d'en-tête au client Envoyez ensuite le contenu de sortie (c'est-à-dire le contenu principal du protocole http). Si vous n'apportez aucune modification aux informations d'en-tête qui ont été envoyées, il nous est impossible d'utiliser l'en-tête. Et setcookie et les autres fonctions qui modifient l'en-tête peuvent tout faire !

Alors résolvons le problème selon lequel PHP ne peut pas modifier les informations d'en-tête !

La première méthode est très simple ! Essayez simplement d'éviter tout contenu de sortie avant l'en-tête et le setcookie. Essayez d'abord de les écrire.

La deuxième solution consiste à utiliser le tampon de sortie du tampon de sortie de PHP. Le tampon de sortie de PHP est comme ceci : placez tout le contenu de sortie du script actuel dans le tampon de sortie. Lorsque le programme est exécuté, ajoutez l'en-tête et le tampon de sortie. et envoyé au client.

Il existe deux méthodes. La première consiste à activer le tampon de sortie dans PHP.ini. La valeur par défaut de output_buffering est 0. Elle peut être définie sur Off ou On si vous souhaitez limiter la valeur maximale du tampon de sortie. , vous pouvez définir cette option sur la valeur spécifiée. Nombre maximum d'octets (par exemple, output_buffering=4096).

Une autre méthode dans laquelle PHP ne peut pas modifier les informations d'en-tête est de l'activer dans un script PHP :

Appelez la fonction ob_start() au début du programme ou au début du fichier public ;

De cette façon, nous avons activé la mise en mémoire tampon de sortie de PHP et nous pouvons effectuer n'importe quelle opération

< ?PHP   
ob_start();  
echo "dfdfd";  
//注意不能卸载ob_start() 前面  
header("content-type:text/html;charset=utf-8");  
setcookie();  
?>

Si vous souhaitez démarrer gzip, vous pouvez ajouter la fonction de rappel ob_gzhandler ob_start("ob_gzhandler ");

Il existe quelques fonctions concernant l'outbuffer :

ob_flush()
Envoyer le tampon de sortie (mise en mémoire tampon de sortie)

ob_end_flush()
Envoyer le tampon de sortie (mise en mémoire tampon de sortie) et désactivez le mécanisme de mise en mémoire tampon de sortie.

ob_end_clean()
Effacez le tampon de sortie sans l'envoyer et désactivez la mise en tampon de sortie.

ob_get_contents()
Renvoie le tampon de sortie actuel dans une chaîne. Vous permet de traiter toute sortie émise par le script.

ob_get_clean()
Renvoie le tampon de sortie actuel dans une chaîne. Vous permet de traiter toute sortie émise par le script et de désactiver le mécanisme de mise en mémoire tampon de sortie.

Il existe également certaines fonctions auxquelles vous pouvez vous référer au manuel PHP Search ob_

< ?PHP  
ob_start();  
print "Here&#39;s a pretty dumb way to calculate the length of a string.";  
$length = strlen(ob_get_content());  
ob_end_clean();  
?>

Cet exemple de PHP incapable de modifier les informations d'en-tête montre une méthode très inefficace pour déterminer la longueur. d'une chaîne. Il n'est pas simplement traité à l'aide de la fonction strlen(), mais est activé en premier Le mécanisme de mise en mémoire tampon de sortie imprime la chaîne, puis détermine la longueur du tampon de sortie. Enfin, effacez la sortie tampon (non envoyé), puis désactivez le mécanisme de mise en mémoire tampon de sortie.

Recommandations associées :

Une exception s'est produite lors de la modification des informations en php, et les informations ne peuvent pas être modifiées

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn