2010-11-29 37 views
0

Je fais de la manipulation d'image lourde en PHP et je voudrais montrer à l'utilisateur comment les choses progressent. J'ai donc essayé de faire quelque chose comme ceci:Progression de php lourd en utilisant des sessions

for($i = 0; $i < $rowCount; $i++) { 
    session_start(); 
    $_SESSION['progress'] = $i/ $rowCount; 
    session_write_close(); 

    processLine($i); 
} 

Et puis j'utilise AJAX appelle à un autre fichier php qui retourne essentiellement la valeur de $ _SESSION [ « progrès »]. Le problème est, il n'est pas défini. Est-ce parce que vous ne devriez pas commencer une session plus d'une fois par fichier? Si je viens d'ouvrir la session et que je ne la ferme pas entre chaque ligne, la variable SESSION est verrouillée et mon fichier d'interrogation ne sera pas traité tant que toute la manipulation de l'image n'aura pas été effectuée.

N'importe quel moyen de faire fonctionner cela en utilisant des sessions? Je pense que cela pourrait fonctionner si je mettais la progression dans une base de données ou un fichier, mais c'est lent et nous devrons faire un peu de travail pour identifier les utilisateurs (en utilisant les ips ou les identifiants de session). Utiliser des sessions prendrait soin de ces choses.

Répondre

1

Ceci est dû au fait que php verrouille le fichier de session. Le premier processus qui utilise toujours la même session verrouille le fichier, l'appel ajax utilise le même ID de session, essayant ainsi d'accéder au même fichier de session, mais il ne peut pas le verrouiller car le premier processus se termine.

Ceci est la réponse à votre question. Si vous voulez savoir comment le réparer, je ne suis pas sûr, je dois y penser.

+0

Oui, je pensais que c'était le problème, donc vous ne pouvez pas débloquer la session dans le processus, de sorte que d'autres processus peuvent l'utiliser pour vérifier la progression – marcusklaas

+0

Non. Pour une approche différente, par exemple, créez un fichier temporaire, peut-être nommé d'après le nom de l'image en cours de traitement, puis enregistrez la progression dans ce fichier temporaire. son fichier php comme checkstatus.php? f = filename – Dmitri

+1

Aussi si vous utilisez memcache, c'est encore mieux et plus rapide d'enregistrer le résultat de la progression dans memcache, il sera juste plus rapide que d'utiliser le fichier temporaire. – Dmitri

0

En toute honnêteté, vous devriez avoir la fonction session_start(); au sommet de chaque script PHP qui utilise des fonctions et seulement celui-là. Supprimez toutes les autres fonctions de session_start et toutes les autres fonctions de session que vous pourriez avoir comme session_write_close();. Ne fermez pas les sessions et n'utilisez rien d'autre, car cela n'est pas nécessaire. Si la valeur ne revient pas, vous pouvez vérifier la console JavaScript dans le navigateur pour vérifier les erreurs PHP retournées ou pour les fichiers nommés error_log dans le répertoire de votre fichier.

Sinon, tout devrait fonctionner comme prévu. J'ai fait des types de choses similaires dans le passé et cela a très bien fonctionné. J'espère que cela vous aidera à déboguer vos problèmes.

+0

Non, cela ne résoudra pas mes problèmes en réalité. Parce que deux fichiers php ne peuvent pas travailler sur la même session en même temps :(Je ne peux pas lire la valeur de la variable de progression pendant que je fais encore ma manipulation d'image de cette façon .. – marcusklaas

+0

Cela est étrange puisque vous devriez pouvoir avoir le même session ouverte deux fois en lecture/écriture, sauf si elle ne met pas à jour la valeur de la session globalement jusqu'à ce que le script de manipulation d'images ait fini d'être exécuté Essayez de démarrer la session et définissez cette variable sur un pourcentage 0 avant d'exécuter le script de manipulation d'images. être quelque chose à essayer si vous ne l'avez pas déjà –