IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Gérer des requêtes PHP trop longues


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 46
    Par défaut Gérer des requêtes PHP trop longues
    Bonjour,

    Je développe une application en PHP avec Symfony2.

    J'ai implémenté des génération de rapports Excel, avec PHPExcel. Ces générations sont très longues car très grand nombre de données, pas grand chose à changer de ce côté-là.

    Mon problème est que le traitement est très long, je cherche donc à faire patienter l'utilisateur.

    J'ai étudié plusieurs pistes pour finalement en choisir une. Lors du submit du formulaire (qui va déclencher la génération et le téléchargement du fichier Excel), je lance un traitement régulier en Javascript, à base d'une méthode appelée régulièrement par setTimeout() et en faisant un get en ajax pour savoir où en est le serveur.

    Si la requête n'est pas trop longue, ça marche bien, disons que ça me permet de savoir quand c'est finit pour effacer le message d'attente (jQuery BlockUI). En effet, vu que côté serveur je renvoie un fichier, côté client, tout est géré par le navigateur, je n'ai aucun moyen de savoir quand c'est finit.

    Donc avec mon système décrit plus haut, c'est bon.

    Maintenant, pour les longues requêtes, je m'aperçois d'une chose innatendue (que je vois grâce à Firebug) : la requête Ajax est bloquée, elle ne reçoit une réponse que quand la requête principale est terminée. Dommage, j'avais prévu un mécanisme pour informer l'utilisateur de l'avancement ...

    Est-ce normal que la requête soit "bloquée" ? Je travaille avec WAMP, les requêtes ne sont pas traitées en parallèles ?

    Merci pour votre aide,

    Xavier

  2. #2
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Tu parles de requête à la base de données ou bien au serveur web ?

    Qu'appelles-tu avec cette requête asynchrone de vérification de l'avancement ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 46
    Par défaut
    Salut,
    Citation Envoyé par transgohan Voir le message
    Tu parles de requête à la base de données ou bien au serveur web ?
    Qu'appelles-tu avec cette requête asynchrone de vérification de l'avancement ?
    Je parle de requête HTTP (ou Ajax) du poste client vers le serveur WEB+PHP (WAMP dans mon cas).

    Pour détailler, la solution que j'ai adopté (que j'aimerai ...) est la suivante :
    - juste avant le submit du formulaire, je crée un token côté client (un identifiant disons) et je lance un traitement Javascript toutes les secondes avec setTimeout
    - je valide la formulaire en y ajoutant le token (dans un input hidden)
    - côté serveur, je crée un fichier avec le token comme nom et j'y stocke des messages d'avancement ("init", "reste encore x lignes à traiter", .... "fini")
    - pendant ce temps, avec mon traitement asynchrone Javascript, je fais des requêtes GET en donnant le token pour avoir l'avancement, en fait, côté serveur, je renvoie le contenu du fichier, et je voudrais l'afficher côté client
    - lorsque le traitement est fini côté serveur, je stocke "fini" dans le fichier
    - côté client, le navigateur récupère le fichier généré par le serveur
    - le traitement asynchrone Javascript récupère un "fini" et je peux enlever le message "'veuillez patienter"

    Tu vois le truc ? C'est pas si compliqué .... ;-)

    Mais le problème, c'est que ma 1ère requête Ajax est bloquée jusqu'à la réception du fichier généré par le serveur. Tout se passe comme si mon serveur (WAMP ? Apache ? PHP ?) ne traitait qu'une seule requeête (HTTP et donc PHP) à la fois .... C'est possible ça ?

    Merci

    Xavier

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Ne pourrais-tu pas définir :
    Si la requête de contrôle ne renvoie rien au bout d'un temps donné (ex : 5 secondes) -> on laisse le message "patientez"

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 46
    Par défaut
    Salut,

    Et merci pour ta collaboration !

    Citation Envoyé par ABCIWEB Voir le message
    Ne pourrais-tu pas définir :
    Si la requête de contrôle ne renvoie rien au bout d'un temps donné (ex : 5 secondes) -> on laisse le message "patientez"
    Alors question, en Ajax, peut-on donner un timeout ?

    Mais de toute façon, ma (mauvaise) surprise est surtout de voir ma requête bloquée le temps que la 1ère soit traitée. Est-ce normal ?

    A vrai dire, la machine sert d'autres applications WEB, et il semblerait que lorsqu'un de mes longs traitement est demandé, les autres clients des autres applis (sur le même WAMP) soient bloqués ... Ca ressemble fort à ma requête bloquée.

    WAMP-PHP n'est pas multi-thread ? Multi-clients en parallèle ? Traite-t-il les requêtes HTTP-PHP en séquentiel ? Peut-être est-ce un problème de réglage de mon WAMP ?

    Merci

    Xavier

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    utilise un système de queue, avec RibbitMQ par exemple

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Citation Envoyé par xnopre Voir le message
    Salut,

    Mais de toute façon, ma (mauvaise) surprise est surtout de voir ma requête bloquée le temps que la 1ère soit traitée. Est-ce normal ?
    Apache à des paramètres permettant de régler le nombre maximal de connexions (MaxClients de mémoire). Si il est défini très bas tu peux être limité dans le nombre de connexion simultané.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/09/2009, 12h10
  2. gérer des requête
    Par badiince dans le forum Programmation et administration système
    Réponses: 0
    Dernier message: 15/04/2009, 22h58
  3. [Requête SQL]Trop longue pour une ligne
    Par jbulysse dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/07/2008, 15h27
  4. Réponses: 5
    Dernier message: 29/11/2006, 11h28
  5. Réponses: 5
    Dernier message: 29/11/2006, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo