Session PHP non lues (mais pas toujours)

ViPHP
ViPHP | 1996 Messages

20 déc. 2009, 18:38

Bonjour à tous,

Récemment j'avais posté un message concernant un hocquet de PHP.
Malheureusement, j'ai lu que des imbéciles n'avaient rien trouvé d'autres à faire que d'effacer les messages...

Sinon concernant mon problème : résumé :
Dès que le script est trop long à s'exécuter, les sessions ne sont pas lu. Je fais beaucoup de :
if (isset($_SESSION["Est_ce_que_utilisateur_est_true"]) && $_SESSION["Est_ce_que_utilisateur_est_true"])
Et lors de ces vérifications : patatra, quand le script mets longtemps à répondre, cette vérification n'est pas faite.
Php me retourne lorsque je fais un
echo de $_SESSION["Est_ce_que_utiolsateur_est_true"]
que _session n'est pas défini. (sans le $)
D'où cela peut -il venir?
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Skikit
Invité n'ayant pas de compte PHPfrance

21 déc. 2009, 15:24

Salut,

Plus d'éléments sont nécessaires pour répondre à ta question.
Quand tu dis que le script est trop long à s'exécuter, c'est à dire ? Plus long que combien de temps ?
Est ce que tu passes par un navigateur pour lancer l'exécution du script ?
Que fais ton script ? Plusieurs pages sont elles appelées ?
N'hésite pas à poster ton script, ça sera beaucoup plus simple.

Sinon, pour t'orienter, il est possible :
- que le serveur sur lequel tu travailles ait un délai d'expiration de session relativement court
- que tu utilises des sleep() qui te font perdre ta session
- que ton navigateur ne réponde plus au serveur au bout d'un moment (-> éventuellement destruction de session)

ViPHP
ViPHP | 1996 Messages

21 déc. 2009, 21:00

Salut,

Plus d'éléments sont nécessaires pour répondre à ta question.
Quand tu dis que le script est trop long à s'exécuter, c'est à dire ? Plus long que combien de temps ?
Est ce que tu passes par un navigateur pour lancer l'exécution du script ?
Que fais ton script ? Plusieurs pages sont elles appelées ?
N'hésite pas à poster ton script, ça sera beaucoup plus simple.

Sinon, pour t'orienter, il est possible :
- que le serveur sur lequel tu travailles ait un délai d'expiration de session relativement court
- que tu utilises des sleep() qui te font perdre ta session
- que ton navigateur ne réponde plus au serveur au bout d'un moment (-> éventuellement destruction de session)
Bonjour Skikit,

Quand je dis plus long, je veux dire qu'il s'agit de requête qui répondent certes rapidement mais dont le volume de données retournés est assez important (de l'ordre de 1 Mo).
Le script passe toujours par un navigateur (entre autre firefox (je n'ai pas testé sous les autres)).
Le script est un script inclus dans un autre c'est tout. Une seule page est appelée ex.: index.php?affiche=page1. Cette page créée se trouve être formée de tout plein de petite page inclue elle même. Par exemple :
index.php?affiche=page1
  • head.php pour les balises meta
    corps.php pour le script en lui même
    footer.php pour le footer.


Il se peut qu'il y ait deux ou trois autres includes selon les besoins et les droits de l'utilisateur (genre une fenêtre de droits administratifs par exemple).
Le problème : le serveur répond toujours correctement dans le script principale. (toujours... Même avec les demandes sur les sessions)
Après plusieurs journée de recherche, le problème vient en fait du script head.php où j'inclus les javascript et les CSS en <link> (j'espère ne pas être trop confus). Dans ces javascript et CSS, j'utilise php et sa fonction header pour simuler un CSS ou un Javascript. Mon outil est très efficace de fait que je créé le javascript en fonction de l'utilisateur. De même pour le CSS, l'utilisateur peut choisir son background-Color, sa police d'écriture,... Le tout stocké dans une base de donnée que je restitue en fonction de l'utilisateur. Ce que j'ai constaté : quand le script principale est "long" (corps.php) => ces deux scripts plante au moment de vérifier si l'utilisateur est bien connecté (via les sessions
if (isset($_SESSION["Est_ce_que_utilisateur_est_true"]) && $_SESSION["Est_ce_que_utilisateur_est_true"])
)

et de quel utilisateur il s'agit
$_SESSION["numero_utilisateur"] == 38 //par exemple
.
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Skikit
Invité n'ayant pas de compte PHPfrance

22 déc. 2009, 12:05

A première vue je dirais que la fonction header est responsable de la perte de session, d'ailleurs, est-elle vraiment nécessaire dans ton cas ? Ta méthode n'est pas très propre, si j'ai bien compris tu as du code php dans ton css et dans ton js, ça m'étonnerait que w3c valide ça ^^.

Enfin bon, je comprends à quoi te sert le php ici mais tu remarqueras que sur la plupart des sites offrant une gestion des styles, il s'agit en fait de listes prédéfinies. Je m'explique : pour chaque utilisateur, il y a un identifiant de style dans la bdd et en fonction de cet identifiant, on inclut le bon css avec un <link> et le js avec un <script>, mais en aucun cas on utilise du php dans un fichier css. Libre à toi ensuite de découper les combinaisons de styles dans plusieurs fichiers css à inclure, exemple :
Pour un utilisateur, ta requête renvoie la police Arial et un background-color:blue, tu peux alors inclure un css pour la police et un autre pour le background, de cette façon, un autre utilisateur qui aurait Arial et background-color:white aurait le meme css de police mais un css différent pour le background.
Quoiqu'il en soit, il y a bien une portion de ton code qui te fait perdre ta session, je ne pense pas que ce soit directement lié aux données renvoyées par ta requête.

ViPHP
ViPHP | 1996 Messages

23 déc. 2009, 15:59

Merci Skikit.
Je suis parti de ton constat et j'ai déplacé les fonctions header, trituré, enlevé, remis mais toujours le résultat.
Alors je me suis demandé comment j'ai géré mes sessions : j'ai en fait "3 sessions" (session_start()):
  • Dans ma page principale
    Dans ma page CSS
    Dans ma page Javascript
Il s'agit bien sûr de la même page et de la même session mais je suis parti de l'hypothèse : et si ce n'était pas la même session, ce serait donc normal que PHP n'interprète pas les sessions à l'identique. J'ai donc regardé dans mes scripts et ai trouvé un session_regenerate_id() qui trainait dans la page principale. Je le mets en commentaire et, hop magique, tout redevient correcte. Mon interprétation (pour le moment car je suis encore en phase de test) : les CSS et Javascript ont leur propre session et PHP l'interprète correctement. En même temps. Mais si la page principale mets plus de temps à répondre, PHP vide le cache de sortie et les CSS et JAVASCRIPT se retrouve sans SESSIONS.
Comme test, j'ai fais une multiple requête énorme (normallement 1Mo de sortie) là j'en suis à 10Mo pour mes tests. Toujours le même constat : sans session_regenerate_id() la page s'affiche bien. Je le remets et un coup sur 4 : les sessions ne sont pas interprétées dans le CSS et Javascript.
Je pense avoir trouvé le 'blème mais je n'arriv epas à comprendre pourquoi... De plus session_regenerate_id() se positionne dans le script principale AVANT les inclusions du CSS et du Javascript. A moins que je le mette tout à la fin.... Mais bon...

Le bon côté de la chose : j'ai optimisé pas mal de page pour savoir du'où cela venait et ai gagné 30% de bande passante...
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 86 Messages

23 déc. 2009, 16:16

Attention, je n'ai pas ton code sous les yeux mais (dans le domaine du possible) le CSS est envoyé et interprété avant toute chose. Si tu veux vraiment creuser ton script, affiche des variables de débogage dans tes pages, tu verras ainsi lesquelles arrivent avant les autres. Ton cas est un peu particulier : un session_start() dans le css, c'est pas censé exister ^^.
Tu as quand même fini par identifier ton problème principal :)