OVH Cloud OVH Cloud

setcookie() & session + memoire limite ?

8 réponses
Avatar
P. Gonogeu
Bonsoir,

Je rencontre un problème de persistence (défaillante) de variables
en COOKIE et en SESSION.
En augmentant le nombre de données stockées en cookie
(d'une dizaine à une vingtaine), je constate que certaines données
ne persistent plus. Par ailleurs, j'observe de manière corrélée
que cela efface parfois certains champs de la $_SESSION.
Tout semble se comporter comme si une certaine place allouée
commune à $_SESSION et $_COOKIE était désormais saturée, et que le
dernier enregistrement des données "se fait de la place".

J'ai dépouillé le listing phpinfo() (4.3.8), compulsé les pages de
php.net à propos de setcookie(), ini_set() et autre register_globals.
La memory_limit et le post_max_size sont à 8M (8 Mo, je suppose).
Or memory_get_usage() indique ~280 ko de mémoire utilisée.
Je ne comprends rien.

Lorsque j'efface tous les cookies, tout va bien jusqu'à ce que
j'ai parcouru à peu près toutes mes pages qui stockent des cookies,
et là ça commence à dérailler.

Je ne sais vraiment plus par quel bout prendre ce problème, et les
archives du forum ne m'ont guère aidé.

Merci pour votre clairvoyance.

Pierre

8 réponses

Avatar
P. Gonogeu
Quelques précisions :

Bonsoir,

Je rencontre un problème de persistence (défaillante) de variables
en COOKIE et en SESSION.
En augmentant le nombre de données stockées en cookie
(d'une dizaine à une vingtaine), je constate que certaines données
ne persistent plus. Par ailleurs, j'observe de manière corrélée
que cela efface parfois certains champs de la $_SESSION.
Tout semble se comporter comme si une certaine place allouée
commune à $_SESSION et $_COOKIE était désormais saturée, et que le
dernier enregistrement des données "se fait de la place".

J'ai dépouillé le listing phpinfo() (4.3.8), compulsé les pages de
php.net à propos de setcookie(), ini_set() et autre register_globals.
La memory_limit et le post_max_size sont à 8M (8 Mo, je suppose).
Or memory_get_usage() indique ~280 ko de mémoire utilisée.
Je ne comprends rien.

Lorsque j'efface tous les cookies,


Depuis la config. du navigateur.
Je teste mes scripts sous Mozilla et IE6.

tout va bien jusqu'à ce que
j'ai parcouru à peu près toutes mes pages qui stockent des cookies,
et là ça commence à dérailler.


i.e. : Je redéfinis progressivement les champs que je sais sauvés
en cookie, au fur et à mesure que je parcours les pages ; et quelque
soit l'ordre du parcours, il arrive un moment où certains champs
sauvés sont effacés, et ça commence à dérailler, sans retour à la
normale.

A noter que le problème se pose autant sous Mozilla que IE6, mais
IE6 -- qui semble plus rapide -- accepte plus de champs (ça bloque
plus tard).

Je ne sais vraiment plus par quel bout prendre ce problème, et les
archives du forum ne m'ont guère aidé.

Merci pour votre clairvoyance.


Quels autres tests me conseillez-vous ? Je suis à cours d'idée.

Pierre


Avatar
__marc.quinton__
P. Gonogeu wrote:

i.e. : Je redéfinis progressivement les champs que je sais sauvés
en cookie, au fur et à mesure que je parcours les pages ; et quelque
soit l'ordre du parcours, il arrive un moment où certains champs
sauvés sont effacés, et ça commence à dérailler, sans retour à la
normale.


normalement on ne definit qu'il seul cookie. D'ailleurs s'il
s'agit de sauvegarder des variables en session, c'est php
qui s'occupe de cette tache. Il n'y a meme pas besoin
de positionner de cookies.

Si tu realise bcp de pages avec bcp de variables a memoriser
il se peut que tu tombes sur un mécanisme de protection des
navigateur empechant l'accumulation excessive de cookies
pour un meme site.

Est-ce que tu as bien lu la doc sur les variables de sesion ?

Avatar
P. Gonogeu

normalement on ne definit qu'il seul cookie.


Ce n'est pas ce que j'ai lu. La doc pour setcookie précise notamment
qu'il est possible de passer un tableau en cookie (ce que je ne fais
pas), mais qu'alors PHP place en fait un cookie par élément de tableau ;
Si on ne souhaite placer qu'un cookie, il faut sérialiser les données
à placer. Je peux essayer de sérialiser mes données, mais je doute fort
que le nombre de cookies pose problème (vu le nombre modeste de cookies
que je définis, comparé à ce que je lis par ailleurs sur le forum).

D'ailleurs s'il
s'agit de sauvegarder des variables en session, c'est php
qui s'occupe de cette tache. Il n'y a meme pas besoin
de positionner de cookies.


Oui, les usages sont complémentaires

Si tu realise bcp de pages avec bcp de variables a memoriser
il se peut que tu tombes sur un mécanisme de protection des
navigateur empechant l'accumulation excessive de cookies
pour un meme site.


C'est ce que je me suis dis. Mais nulle part dans les préférences
de Mozilla et IE6 je n'ai vu défini un tel nombre critique.
J'ai l'impression qu'il y a peut-être un problème de rapidité du
serveur à transmettre les données. Juste après un session_start(),
j'ai ajouté une boucle foreach ($_SESSION $k=>$v)echo "$k=$v";
et je constate alors -- outre l'affichage -- que les champs de
$_SESSION[] restent intègres (ce qui n'est pas le cas avec un seul
echo du champ identifiant qui disparait). Cependant, le problème de
l'effacement de certains champs en cookie demeure.

Si cet affichage a un effet temporisateur, sauf erreur il devrait
cependant bénéficier aussi à $_COOKIE...

Pierre

Avatar
P. Gonogeu
J'ai l'impression qu'il y a peut-être un problème de rapidité du
serveur à transmettre les données. Juste après un session_start(),
j'ai ajouté une boucle foreach ($_SESSION $k=>$v)echo "$k=$v";
et je constate alors -- outre l'affichage -- que les champs de
$_SESSION[] restent intègres (ce qui n'est pas le cas avec un seul
echo du champ identifiant qui disparait). Cependant, le problème de
l'effacement de certains champs en cookie demeure.

Si cet affichage a un effet temporisateur, sauf erreur il devrait
cependant bénéficier aussi à $_COOKIE...


C'était bien ça !!
En ajoutant une pause après chaque setcookie(), avec usleep(),
tous les problèmes disparaissent !
En l'occurence, 150 microsecondes suffisent. J'ai mis 1 ms, par
sécurité.
Au passage : fr.php.net nous dit que usleep() est inopérante avant PHP
5.0.0 ; j'utilise 4.3.8, et usleep() fonctionne (testé entre deux
microtime()).

A bon entendeur...

Pierre

Avatar
Marc

C'est ce que je me suis dis. Mais nulle part dans les préférences
de Mozilla et IE6 je n'ai vu défini un tel nombre critique.
J'ai l'impression qu'il y a peut-être un problème de rapidité du
serveur à transmettre les données. Juste après un session_start(),
j'ai ajouté une boucle foreach ($_SESSION $k=>$v)echo "$k=$v";
et je constate alors -- outre l'affichage -- que les champs de
$_SESSION[] restent intègres (ce qui n'est pas le cas avec un seul
echo du champ identifiant qui disparait). Cependant, le problème de
l'effacement de certains champs en cookie demeure.


c'est peut-etre le protocole http qui limite la taille des header.
et d'autre part comme tous (j'ai bien dis tous) les cookies doit
etre transmis a toutes les requetes (pour un meme site), c'est
un peu gaspiller de la bande passante.

Pour ma part, pour une application, 1 ou 2 coockies sont largement
suffisant.

Avatar
P. Gonogeu

C'est ce que je me suis dis. Mais nulle part dans les préférences
de Mozilla et IE6 je n'ai vu défini un tel nombre critique.
J'ai l'impression qu'il y a peut-être un problème de rapidité du
serveur à transmettre les données. Juste après un session_start(),
j'ai ajouté une boucle foreach ($_SESSION $k=>$v)echo "$k=$v";
et je constate alors -- outre l'affichage -- que les champs de
$_SESSION[] restent intègres (ce qui n'est pas le cas avec un seul
echo du champ identifiant qui disparait). Cependant, le problème de
l'effacement de certains champs en cookie demeure.



c'est peut-etre le protocole http qui limite la taille des header.
et d'autre part comme tous (j'ai bien dis tous) les cookies doit
etre transmis a toutes les requetes (pour un meme site), c'est
un peu gaspiller de la bande passante.

Pour ma part, pour une application, 1 ou 2 coockies sont largement
suffisant.


Je me suis réjouis trop vite dans mon message de 19:56 : Tous les
problèmes sont revenus ! Je ne comprends pas les causes de cette
intermittence.
Quelque part, les données sont coupées. Ton hypothèse expliquerait
très bien ce que j'observe. Cela n'aurait rien de spécifique à PHP.
J'ai aussi commencé à regarder du coté de la gestion du cache. Mais
je ne comprends pas grand chose aux nombreuses directives du protocole
HTTP. Il y a beaucoup à lire.

Le site que je développe comprend une quinzaine de services différents.
En tout, actuellement, je définis 31 cookies, pour autant de champs
que je souhaite pérenniser au delà de l'extinction du PC.
Par ailleurs, j'ai défini une trentaine de champs en $_SESSION[].
J'ai vu que les sessions utilisent parfois des cookies pour se
propager, mais que cela est paramétrable. En ajoutant
ini_set("session.use_cookies","0") avant mes session_start(), la
situation n'est pas meilleure.
J'ai aussi essayé en sérialisant $_POST et en définissant un seul cookie
pour enregistrer le résultat. La situation semblait avoir empirée.

Je ne vois plus trop comment faire. Je suis quand même très surpris
par tous ces problèmes,a lors que je ne demande pas la Lune à HTTP.
Peut-être existe-t-il un moyen d'indiquer aux serveurs traitant les
en-tête HTTP que la taille maximale de l'en-tête est augmentée. Je
vais me pencher là-dessus maintenant.

Merci pour ta remarque. S'il y en a d'autres à suivre, elles restent
bienvenues !

Pierre


Avatar
P. Gonogeu

c'est peut-etre le protocole http qui limite la taille des header.
et d'autre part comme tous (j'ai bien dis tous) les cookies doit
etre transmis a toutes les requetes (pour un meme site), c'est
un peu gaspiller de la bande passante.

Pour ma part, pour une application, 1 ou 2 coockies sont largement
suffisant.


Ca fonctionne -- enfin ! --, et de manière stable ! En sérialisant
"massivement". Ce devait donc bien être dû à une taille maximale
d'en-tête HTTP. Comme la taille d'un cookie est essentiellement
déterminée par les directives de format plus que par le volume de
la valeur à enregistrer, la sérialisation réduit beaucoup le volume
total de l'en-tête HTTP.

Ma première tentative de sérialisation fut infructueuse pour deux raisons :
* Il me manquait un stripslashes(). Il faut écrire
$cookie = unserialize(stripslashes($_COOKIE["clef"]));
sans quoi $cookie reste vide.
* Il fallait que j'efface tous les cookies du site prédéfinis et
toujours vus par le navigateur, et qui -- selon ta remarque -- étaient
tous chargés en en-tête HTTP même lorsque non utilisés par mes pages.

Cela clôt plus de 12h de galère. A la bonne heure !
Encore merci.

Pierre

PS: Je n'ai pas trouvé la valeur de la taille limite de l'en-tête HTTP.

Avatar
Marc

Merci pour ta remarque. S'il y en a d'autres à suivre, elles restent
bienvenues !


je veux bien t'aider et proceder a des essais sur le nombre de cookies,
mais encore faudrait-il etre certain de faire exactement la meme chsose
que toi.

Montre nous des sections de code, la ou tu créé les cookies.