Maison >php教程 >PHP开发 >Le conflit de cookie et de session de ThinkPHP rend le cookie inutilisable.

Le conflit de cookie et de session de ThinkPHP rend le cookie inutilisable.

高洛峰
高洛峰original
2016-12-22 10:47:471209parcourir

Lorsque je faisais récemment un sondage pour un site Web, j'ai rencontré un conflit entre les cookies et les sessions dans ThinkPHP, ce qui empêchait l'utilisation des cookies.

Ce site Web est réalisé en utilisant le framework ThinkPHP. Il y a une page qui affiche de nombreuses images doit avoir un vote correspondant En limitant l'adresse IP, cela limite le nombre de visiteurs dans un certain temps. plage. Vote d'image, mais chaque image ne peut être votée qu'une seule fois. Ce problème a été initialement résolu en utilisant l'IP pour la stocker dans la base de données. Plus tard, il a été amélioré pour utiliser le stockage de session. L'adresse IP est dans le fichier de service, mais l'ID de session généré doit être utilisé. être stocké dans un cookie local. Suivez les instructions du manuel ThinkPHP. Le fonctionnement de la session s'est déroulé sans problème, mais après avoir généré le cookie, le texte du cookie n'a pas pu être trouvé sur l'ordinateur local. génération de cookies, mais les résultats de la visualisation et des tests ont montré qu'il n'y avait pas de limite, j'ai donc créé un fichier PHP séparé, testé le cookie généré, pas de problème, le texte du cookie a été trouvé localement, j'ai donc trouvé le contenu suivant en ligne. Le problème a été résolu dans l'ordre, en utilisant la fonction setcookie() pour définir le cookie, et a obtenu le résultat souhaité.

La solution est la suivante :

Recherchez le fichier de configuration php.ini, puis recherchez un élément : output_buffering, changez sa valeur de off à on, et redémarrez Apache et ce sera d'accord.

Il existe également de nombreux problèmes similaires :

Parfois, vous constaterez que des fichiers qui s'exécutaient initialement sans problème localement, lorsqu'ils sont testés sur le serveur, provoquent en fait une erreur qui n'apparaît pas localement : Attention : Impossible de modifier les informations d'en-tête - en-têtes déjà envoyés par...
 Une telle déclaration, évidemment, la raison en est causée par setcookie Après avoir vérifié sur Internet, il y a l'explication suivante : Il existe certaines restrictions sur l'utilisation des cookies. eux-mêmes, par exemple :

1. La description de l'appel de setcookie doit être placée avant la balise
2. Echo ne peut pas être utilisé avant d'appeler setcookie
3. Le cookie n'apparaîtra dans le programme que lorsque la page Web est rechargée
4. La fonction setcookie doit envoyer

avant que des données ne soient envoyées au navigateur. Sur la base des restrictions ci-dessus, lors de l'exécution de la fonction setcookie(), vous rencontrerez souvent « Non défini. index" et "Impossible de modifier les informations d'en-tête" - en-têtes déjà envoyés par"... et d'autres problèmes. La façon de résoudre l'erreur "Impossible de modifier les informations d'en-tête - en-têtes déjà envoyés par" consiste à retarder la sortie des données vers le navigateur avant de les générer. le cookie. Par conséquent, vous pouvez ajouter Utilisez la fonction ob_start(). De cette façon, le problème peut être résolu. Mais si vous souhaitez ajouter ob_start(), ce n'est pas très réalisable. Le programme a été écrit, donc cela semble un peu déprimant de changer cela ! Lorsque j'ai découvert que cette erreur avait été provoquée, je me suis demandé pourquoi mon ordinateur local n'avait pas provoqué ce problème. Je pensais que c'était parce que la configuration de PHP.ini était différente, mais quand j'y ai réfléchi, c'était faux. tout de même. J'ai donc regardé la phrase "la sortie a commencé à..." qui a suivi, ce qui signifiait qu'il y avait une sortie à un autre endroit avant setcookie, j'ai donc trouvé le fichier qui suivait la sortie a commencé à, et j'ai finalement trouvé que la première ligne était vide.

Pour plus d'articles sur les cookies de ThinkPHP et les conflits de session qui rendent les cookies inutilisables, veuillez prêter attention au site Web chinois de PHP !

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