Bonjour à tous,
Un problème un peu inédit pour moi se présente. Je pense avoir la solution, mais j'aimerai votre avis sur la théorie avant de me lancer dans le codage.
La situation
Je vais avoir un script dont l'exécution pourrait se révéler un peu longue (de l'ordre de quelques minutes) ; il s'agit d'une boucle faisant un à deux appel SQL.
Les problèmes
L'esquisse de solution
Voici ce que je pense faire :
L'utilisateur remplit le formulaire avec tous les paramètres et l'envoi en POST. Une première page vérifie que tout est OK (droits de l'utilisateur, cohérence du formulaire, etc.) ; si tout est bon, au lieux d'exécuter l'opération, elle enregistre les variables en y ajoutant un identifiant généré aléatoirement dans la SESSION de l'utilisateur courant et renvoi vers une deuxième page.
Cette deuxième page contient un script (jQuery) qui lance une requête POST en fournissant comme argument l'identifiant généré aléatoirement. Cela permet au serveur de savoir quel script exécuter, éviter qu'il le soit deux fois, et tout devrait se faire en arrière plan. Au fur et à mesure de l'avancement du script, une variable enregistrée en SESSION indique l'avancement, en outre un set_time_limit(30) sera inclus dans la boucle pour éviter tout problème de ce côté là.
La deuxième page contient un autre script qui émettrait une requête (toujours en jQuery), toutes les 2 secondes (moins ? plus ?) qui demande où en est le script (en utilisant encore l'identifiant généré aléatoirement). Quand cette requête lui indique que le script est fini, elle lance une redirection vers une troisième page qui affiche le résultat.
Naturellement, pour que ça marche, il faut pas laisser traîner les session ouvertes.
Les questions
Est-ce que ça vous paraît cohérent ? tenable et sûr ? est-ce que j'ai oublié quelque chose ?
Que se passe-t-il si l'utilisateur quitte la page ? pas grand chose je suppose, puisque le script principal est déjà lancé et qu'on attend pas de réponse de ce côté-ci.
Qu'est-ce qui se passerait en revanche si l'utilisateur se déconnecte ? Comment serait traitée session_start() et l'enregistrement dans $_SESSION lorsque l'utilisateur courant se sera déconnecté ?
Un problème un peu inédit pour moi se présente. Je pense avoir la solution, mais j'aimerai votre avis sur la théorie avant de me lancer dans le codage.
La situation
Je vais avoir un script dont l'exécution pourrait se révéler un peu longue (de l'ordre de quelques minutes) ; il s'agit d'une boucle faisant un à deux appel SQL.
Les problèmes
- Durée max du script PHP ; ce problème n'est pas essentiel puisque je suis sur un serveur Linux et que le temps du script est essentiellement lié à l'interrogation de la base qui n'est pas décomptée, mais ce serait le cas si le site venait à être exécuté sur un serveur Windows.
- UX, il n'est pas bon que l'utilisateur soit confronté à une page lente.
- Durée max HTTP, il pourrait être mis fin à la connexion si rien n'est renvoyé.
L'esquisse de solution
Voici ce que je pense faire :
L'utilisateur remplit le formulaire avec tous les paramètres et l'envoi en POST. Une première page vérifie que tout est OK (droits de l'utilisateur, cohérence du formulaire, etc.) ; si tout est bon, au lieux d'exécuter l'opération, elle enregistre les variables en y ajoutant un identifiant généré aléatoirement dans la SESSION de l'utilisateur courant et renvoi vers une deuxième page.
Cette deuxième page contient un script (jQuery) qui lance une requête POST en fournissant comme argument l'identifiant généré aléatoirement. Cela permet au serveur de savoir quel script exécuter, éviter qu'il le soit deux fois, et tout devrait se faire en arrière plan. Au fur et à mesure de l'avancement du script, une variable enregistrée en SESSION indique l'avancement, en outre un set_time_limit(30) sera inclus dans la boucle pour éviter tout problème de ce côté là.
La deuxième page contient un autre script qui émettrait une requête (toujours en jQuery), toutes les 2 secondes (moins ? plus ?) qui demande où en est le script (en utilisant encore l'identifiant généré aléatoirement). Quand cette requête lui indique que le script est fini, elle lance une redirection vers une troisième page qui affiche le résultat.
Naturellement, pour que ça marche, il faut pas laisser traîner les session ouvertes.
Les questions
Est-ce que ça vous paraît cohérent ? tenable et sûr ? est-ce que j'ai oublié quelque chose ?
Que se passe-t-il si l'utilisateur quitte la page ? pas grand chose je suppose, puisque le script principal est déjà lancé et qu'on attend pas de réponse de ce côté-ci.
Qu'est-ce qui se passerait en revanche si l'utilisateur se déconnecte ? Comment serait traitée session_start() et l'enregistrement dans $_SESSION lorsque l'utilisateur courant se sera déconnecté ?