2 votes

Accéder à la variable de session définie dans script 1, dans script 2. PHP

J'ai une boucle qui effectue certaines actions, dans la boucle j'ai un compteur de session qui s'incrémente. Il faut environ 10 à 15 minutes pour que cette boucle se termine, j'aimerais donc avoir une sorte de barre de progression qui indique à l'utilisateur où en est la boucle.

Mon appel AJAX est censé récupérer la valeur de la session que j'ai définie à l'intérieur de la boucle, mais cela ne semble pas fonctionner. J'obtiens une erreur d'index non défini.

J'ai lu quelque part que la session est verrouillée une fois qu'elle est utilisée par un script et qu'elle n'est pas déverrouillée tant qu'il n'a pas fini de l'utiliser. Est-il possible de forcer le déverrouillage de la session pour que mon script ajax puisse récupérer la valeur de la session ?

Exemple :

script 1 (Boucle) :

while(SOME CONDITION) {
    //DO ACTIONS

    $_SESSION['progress'] = $currProgress + 1;
}

script 2 (AJAX Call Retrieve Session) :

function getCurrentProgress() {
   $progress = isset($_SESSION['progress']) ? $_SESSION['progress'] : 0;
   echo json_encode(array('progress' => $progress));
}

JS AJAX (appels toutes les 30 secondes) au script ci-dessus

2voto

Spudley Points 85371

Par défaut, les modifications apportées à la session PHP ne sont pas écrites dans la mémoire de la session avant la fin du programme ; pendant que le programme est en cours d'exécution, $_SESSION est comme n'importe quelle autre variable ; elle n'est accessible qu'à l'intérieur de son propre programme ; ce n'est que lorsque le programme se termine et que la session est écrite sur le disque que le programme suivant peut accéder aux changements que vous avez apportés aux données de la session. La réponse courte est donc que vous ne pourrez pas faire cela simplement en vérifiant la session et en vous attendant à ce que les dernières mises à jour s'y trouvent.

Vous pouvez forcer PHP à écrire dans la session à n'importe quel moment du programme en utilisant l'option session_write_close() mais, comme le nom de la fonction l'indique, cela fermera également la session de ce programme, qui ne pourra donc plus faire de mises à jour.

Je suppose que vous pourriez alors rouvrir la session, mais cela commence à s'aventurer sur un terrain dangereux. Même si cela fonctionnait, ce serait très inefficace.

En fin de compte, la session PHP est écrite dans un fichier, comme n'importe quelle autre sortie, mais l'ouverture et la fermeture répétées de ce fichier entraînent des frais généraux importants. Donc, si vous envisagez ce qui précède, oubliez-le -- vous pouvez tout aussi bien demander à votre programme d'écrire sa progression dans un fichier temporaire ou même dans une base de données. Ou si vous voulez des performances, utilisez memcache.

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