Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/03/2006, 12h04   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2003
Messages : 68
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 68
Points : 13
Points : 13
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.
choas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2006, 12h10   #2
Membre émérite
 
Avatar de macbook
 
Inscription : février 2006
Messages : 840
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 840
Points : 924
Points : 924
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.
__________________
Consultant idéaliste.
macbook est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2006, 12h22   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2003
Messages : 68
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 68
Points : 13
Points : 13
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.
choas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2006, 12h48   #4
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 421
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 421
Points : 2 809
Points : 2 809
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
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2006, 13h08   #5
Candidat au titre de Membre du Club
 
Inscription : décembre 2003
Messages : 68
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 68
Points : 13
Points : 13
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.
choas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2006, 13h32   #6
Membre émérite
 
Avatar de macbook
 
Inscription : février 2006
Messages : 840
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 840
Points : 924
Points : 924
Sauf si tu as enregistré en session ce qu'il faut afficher.

Pour flush() considères ce snippet :

Citation:
<?php
    $i 
;
    while ( 
$i 10 )
    {
    echo 
$i '<br />' ;
    
sleep ) ;
    
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.
__________________
Consultant idéaliste.
macbook est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2006, 13h44   #7
Candidat au titre de Membre du Club
 
Inscription : décembre 2003
Messages : 68
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 68
Points : 13
Points : 13
Citation:
Envoyé par macbook
Sauf si tu as enregistré en session ce qu'il faut afficher.

Pour flush() considères ce snippet :

Citation:
<?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).
choas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2006, 16h20   #8
Membre émérite
 
Avatar de macbook
 
Inscription : février 2006
Messages : 840
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 840
Points : 924
Points : 924
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.
__________________
Consultant idéaliste.
macbook est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2006, 18h35   #9
Candidat au titre de Membre du Club
 
Inscription : décembre 2003
Messages : 68
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 68
Points : 13
Points : 13
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
choas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2006, 20h19   #10
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
html, <meta> dans le <head>
javascript, location.href = new_url;
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h26.


 
 
 
 
Partenaires

Hébergement Web