PHP : utiliser la session sur la page sans interférer avec le chargement de la session sur une autre page
P粉006977956
2023-08-08 13:05:15
<p>J'utilise CURL pour télécharger un fichier volumineux à partir d'une URL externe et l'enregistrer sur mon serveur. Cela peut prendre plusieurs minutes. Pendant le téléchargement, j'utilise curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,.. pour exécuter une fonction anonyme qui met périodiquement à jour ma variable $_SESSION['download_progress'] pour obtenir les informations de téléchargement actuelles. </p>
<p>Maintenant, tout cela se passe dans le fichier upload.php, et pendant que l'utilisateur attend que le fichier soit téléchargé, j'utilise JavaScript pour demander la page progress.php, qui contient ce code simple : </p>
<pre class="brush:php;toolbar:false;">session_start();
echo $_SESSION['download_progress'];</pre>
<p>Cela permet à mon code JavaScript d'afficher des informations sur la progression du téléchargement. </p>
<p> Sauf que ça ne marche pas. </p>
<p>La page "progress.php" ne se chargera pas tant que "upload.php" n'aura pas fini de se charger (en d'autres termes, deux pages ne se chargeront qu'après la fin du téléchargement du fichier), ce qui est mauvais. session_start() empêche d'une manière ou d'une autre le chargement de la page "progress.php". J'utilise mon propre serveur (apache php 5.4) j'ai donc tous les droits d'administrateur. </p>
<p>Comment résoudre ce problème ? Je pourrais utiliser des solutions de contournement disgracieuses, telles que l'écriture des informations de téléchargement dans un fichier texte au lieu de la variable de session, puis l'utilisation de JavaScript pour lire directement ce fichier texte, mais je préfère ne pas le faire. Merci</p><p><br /></p>
Vous rencontrez un problème de session basé sur le système de fichiers. Le script de téléchargement verrouille le fichier principal de session pendant l'exécution, de sorte que les informations de session ne sont pas accessibles tant que le verrou n'est pas libéré.
Le plus simple est de faire en sorte que votre script de téléchargement libère périodiquement et reverrouille la session en même temps, cela donne à votre script de progression une chance de lire la session ;
Pour libérer le verrouillage de session, appelez session_write_close n'importe où dans le script de téléchargement. Cela vous empêchera d'accéder aux variables de session jusqu'à ce que session_start soit rappelé ultérieurement. Vous pouvez répéter ce cycle.
Il existe d'autres solutions plus puissantes. Par exemple, vous pouvez déplacer les informations de progression vers un mécanisme de stockage qui ne détient pas de verrou pendant l'exécution du script ; vous pouvez identifier les informations de chaque utilisateur en fonction de l'ID de session (si une session existe, vous n'avez pas besoin de la démarrer pour obtenir son identifiant)