2 votes

Comment supprimer/supprimer le cookie de session PHP

Je dois supprimer un en-tête de cookie de session déjà défini, mais je ne trouve aucun moyen de le faire.

~~Pourquoi ?
J'ai besoin de rendre une image, envoyée par un script PHP, cachable par l'utilisateur final ; cette image est utilisée pour suivre si une newsletter a été lue par le récepteur, donc si l'image est demandée, je sais que la newsletter a été lue. J'ai seulement besoin de savoir quand la newsletter est ouverte pour la première fois, les demandes suivantes peuvent être ignorées. Le problème est que, même si j'ai correctement défini les en-têtes Expire et Cache-Control, l'image est demandée chaque fois que l'utilisateur ouvre la newsletter - seule cette image est utilisée pour le suivi - essentiellement parce qu'elle n'est pas mise en cache par l'utilisateur. J'ai utilisé ceci outil pour comprendre pourquoi l'URL n'est pas cachable, et il dit que c'est à cause du cookie envoyé.~~

Ce que je veux éviter, c'est que l'utilisateur constate un retard dans le chargement de l'image de suivi.

Donc j'ai un session_start() dans la fonction init de mon site web, que je ne veux pas supprimer, parce que le site web est grand et compliqué, et qu'il n'est pas souhaitable de faire un changement radical comme démarrer la session seulement si nécessaire (une des solutions que j'ai envisagées). Appeler session_start() définit le Set-Cookie: avec l'en-tête PHPSESSID cookie, et je dois le supprimer. En lisant le header() sur php.net, j'ai essayé de le définir avec une valeur vide comme ceci

header('Set-Cookie:');
header('Set-Cookie:', true);
header('Set-Cookie: ');
header('Set-Cookie: ', true);

avant et après un appel à session_write_close() mais tout ce que j'ai obtenu, c'est que l'utilisateur reçoive un message d'erreur. Set-Cookie: sans aucune valeur, exactement comme cela est écrit dans l'en-tête header l'argument de la fonction.

Je dois dire que j'utilise toujours PHP 5.2, et que je ne peux donc pas utiliser la fonction header_remove() que je vois dans le manuel, et lighttpd 1.4.24.

EDITAR: Il semble donc que l'outil que j'ai utilisé pour vérifier mes en-têtes ne soit pas si bon que ça. J'ai regardé les en-têtes avec curl --head et a vu les en-têtes ci-dessous.

HTTP/1.1 200 OK
X-Powered-By: PHP/5.2.9
Set-Cookie: PHPSESSID=qn3ms55nvst2717e7b73qqu445; path=/
Last-Modified: Sun, 29 Mar 2009 21:53:36 GMT
ETag: "cb1dffff8c10db7b0a88794b1453cab8"
Expires: Sun, 20 Dec 2009 23:28:07 GMT
Cache-Control: private, max-age=2592000
Pragma: no-cache
Content-Type: image/png
Content-Length: 1322
Date: Fri, 20 Nov 2009 23:28:07 GMT
Server: lighttpd/1.4.24

Comme vous le voyez, il s'agit d'une Pragma: no-cache . L'outil que j'ai utilisé disait que le Pragma L'en-tête n'est pas utilisé, mais c'était une erreur. J'ai essayé de définir Pragma: cache et le client de messagerie a mis l'image en cache.

J'ai fait une autre découverte, peut-être l'impossibilité de débloquer les Set-Cookie est dû à lighttpd, puisque je ne peux pas supprimer l'en-tête Pragma l'en-tête en utilisant header('Pragma:') . J'attends avec impatience la version 5.3 de PHP. Est-ce que quelqu'un qui utilise Apache peut confirmer que l'énoncé ci-dessus header L'appel supprime le Pragma en-tête ?

Merci txyoji pour ce commentaire éclairant :-)

À ce stade, il semble que cette question ne soit là que pour confirmer que lighttpd ne peut pas supprimer les en-têtes en définissant un en-tête sans valeur.

2voto

gogol Points 21

Essayez header_remove('Set-Cookie');

1voto

Gordon Points 156415

De session_destroy :

Afin de tuer la session tout simplement, comme pour déconnecter l'utilisateur, l'identifiant de session doit également être désactivé. Si un cookie est utilisé pour propager l session (comportement par défaut), alors le cookie de session doit être supprimé. setcookie() peut être utilisé pour cela.

Ce code fonctionne-t-il ?

setcookie("PHPSESSID", 'foo', time()-3600);  /* expired 1 hour ago */

Une autre solution serait de servir l'image par le biais d'un fichier PHP, de sorte que chaque fois qu'elle est demandée, vous pouvez mettre à jour votre base de données et placer un indicateur dans votre table d'abonnés pour signaler que la newsletter a été ouverte. Une solution beaucoup plus propre, selon moi. Vous intégreriez l'image avec un code comme celui-ci :

<img src="http://www.example.com/tracker.php?idhash=1234234"/>

où idhash peut être une combinaison de l'ID de l'abonné et de l'ID de la newsletter.

0voto

Byron Whitlock Points 29863

Pouvez-vous augmenter la durée des sessions afin qu'elles n'expirent pas lorsque l'utilisateur ferme son navigateur ? Définissez une variable de session la première fois que l'image est chargée par l'utilisateur. De cette façon, cela n'a pas d'importance si l'image a été demandée plusieurs fois. Vous ne mettez à jour la base de données que lorsque la variable n'est pas définie.

0voto

Pekka 웃 Points 249607

Êtes-vous sûr que l'image est demandée à cause du cookie de session, et pas simplement parce que le client de messagerie, pour une raison ou une autre, ne fait pas de mise en cache ?

0voto

Paul Huff Points 143

Que diriez-vous de changer conditionnellement le nom du cookie de session avec session_name() en fonction de l'url demandée ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X