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 :

Longue boucle ?


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 68
    Points : 43
    Points
    43
    Par défaut Longue boucle ?
    Salut,

    Voilà, j'ai une fonction qui importe une série d'enregistrement dans ma DB, il peu y avoir plusieurs centaines d'enregistrement avec pour chaque enregistrement un déplacement de fichier. C'est parfois donc plutot long, et j'ai un probleme. Apres un certain temps le script s'arrete, tout les enregistrement déja effectuer sont correctes mais jamais la totaliter, il s'arrete apres 20-30 secondes je dirais. Donc voila mon problème principale.

    De plus j'aimerais éviter (meme une fois se problème résolu) que la fonction donne simplement l'impression d'une page qui met 5 minutes a charger, donc je voulais afficher ligne par ligne chaque enregistrement ajouter au fure et à mesure de l'exécution du script. En théorie c'est simple j'affiche simplement dans ma boucle une ligne de tableau a chaque fois. Mais en pratique ca ne marche pas vu qu'il ne les affiche qu'une fois le script php totalement interpreter, dont apres les 5 minutes d'attente ^^

    Voilà je sais que c'est faisable puisque j'ai déjà un script existant mais comme il est crypter en Zend, difficile d'aller chercher de l'inspiration dessus lol.

    Merci beaucoup pour votre aide.

  2. #2
    Membre éprouvé Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Points : 1 009
    Points
    1 009
    Par défaut
    Tu devrais limiter ta boucle à moins d'itération, sinon pour afficher le résultat du tratement de ta boucle "en temps réel" c'est à dire au fur et à mesure tu peux utiliser flush() dans ta boucle.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 68
    Points : 43
    Points
    43
    Par défaut
    Pour flush je viens d'essayer mais ca marche pas, enfin je sais ptet pas l'utiliser. Je doit juste placer flush(); a la fin de chaque itération de ma boucle ?

    J'ai essayer ob_flush() ca donne rien non plus.

  4. #4
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    tu devrais aussi faire attention au time out

    pour ma part j'utilise la session et un header de redirection pour faire des traitement par lot

    bref mon script traite un lot dans l'ensemble place en session l'état d'avancement du travail et envoit un header de redirection au client contenant le script lui même
    le client rappelle donc le script qui passe alors au lot suivant.

    ainsi le temps du script n'est pas trop long et donc pas de risque de time out.

    par contre il ne faut pas trop morceler car à chaque rappel il faut reprendre tout le contexte donc réouvrir des fichier des connexion etc..

    A+JYT

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 68
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par sekaijin
    tu devrais aussi faire attention au time out

    pour ma part j'utilise la session et un header de redirection pour faire des traitement par lot

    bref mon script traite un lot dans l'ensemble place en session l'état d'avancement du travail et envoit un header de redirection au client contenant le script lui même
    le client rappelle donc le script qui passe alors au lot suivant.

    ainsi le temps du script n'est pas trop long et donc pas de risque de time out.

    par contre il ne faut pas trop morceler car à chaque rappel il faut reprendre tout le contexte donc réouvrir des fichier des connexion etc..

    A+JYT
    Si je redirige a chaque fois alors il m'est impossible d'afficher ligne par ligne les enregistrments non ? Puisque la page sera reloader.

  6. #6
    Membre éprouvé Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Points : 1 009
    Points
    1 009
    Par défaut
    Sauf si tu as enregistré en session ce qu'il faut afficher.

    Pour flush() considères ce snippet :

    <?php
    &#160;&#160;&#160;&#160;$i&#160;
    =&#160;0&#160;;
    &#160;&#160;&#160;&#160;while&#160;(&#160;
    $i&#160;<&#160;10&#160;)
    &#160;&#160;&#160;&#160;{
    &#160;&#160;&#160;&#160;echo&#160;
    $i&#160;.&#160;'<br&#160;/>'&#160;;
    &#160;&#160;&#160;&#160;
    sleep&#160;(&#160;1&#160;)&#160;;
    &#160;&#160;&#160;&#160;
    flush()&#160;;
    &#160;&#160;&#160;&#160;
    $i&#160;++&#160;;
    &#160;&#160;&#160;&#160;}
    ?>

    Phpsyntaxcolor powered by decabodi.com
    Ici j'utilise la fonction sleep() pour ralentir ma boucle sinon on ne verrait pas grand chose, mais ce script affiche l'incrémentation de $i toutes les secondes jusqu'à son achèvement.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 68
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par macbook
    Sauf si tu as enregistré en session ce qu'il faut afficher.

    Pour flush() considères ce snippet :

    <?php
    $i
    = 0 ;
    while (
    $i < 10 )
    {
    echo
    $i . '<br />' ;
    sleep ( 1 ) ;
    flush() ;
    $i ++ ;
    }
    ?>

    Phpsyntaxcolor powered by decabodi.com
    Ici j'utilise la fonction sleep() pour ralentir ma boucle sinon on ne verrait pas grand chose, mais ce script affiche l'incrémentation de $i toutes les secondes jusqu'à son achèvement.
    Oui j'ai aussi un exemple qui marche, mais une fois incorporer dans mon code ca marche plus :s Il parait que la longeur des lignes est importante, elles doivent etre longue pour que le flush marche, effectivement, dans mon exemple si j'enleve le pad_str() qui génère une longue ligne de blanc, il marche plus (server windows, client firefox).

  8. #8
    Membre éprouvé Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Points : 1 009
    Points
    1 009
    Par défaut
    Il faut peut-être buffériser le tout avant ? Avec ob_flush par exemple.

    Ce n'est pas une technique très utilisée parce qu'elle comporte quelques contraintes semble t'il.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 68
    Points : 43
    Points
    43
    Par défaut
    A propos de la redirection, j'ai un ptit probleme, etant donné que j'affiche du code html a chaque debut de script, la fonction header("location: xxx") ne marche pas. Donc je ne sais pas rediriger le script sur lui meme.

    Il y a un autre moyen pour rediriger vers une page ?

    Merci

  10. #10
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    html, <meta> dans le <head>
    javascript, location.href = new_url;

Discussions similaires

  1. Garder la main pendant une longue boucle d'exécution ?
    Par bourinator dans le forum Langage
    Réponses: 3
    Dernier message: 13/12/2010, 23h32
  2. Réponses: 9
    Dernier message: 24/12/2007, 11h27
  3. Test possibilités possible longue boucle
    Par BATiViR dans le forum Delphi
    Réponses: 84
    Dernier message: 06/06/2007, 11h06
  4. [debutant] boucle trop longue?
    Par dolu02 dans le forum Langage
    Réponses: 3
    Dernier message: 30/04/2007, 16h17
  5. Réponses: 4
    Dernier message: 09/12/2005, 08h25

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