Petit probleme file d'attente...

Répondre
plc2k
le 12/10/2003 à 18:51
plc2k
bonjour,
voila j'avais fait un petit script qui permetait de gerer une espece de file d'attente en php tout marchait bien, mais il semble qu'avec la derniere version de php 4 jai des soucis..
je m'explique, une 1ere personne upload un fichier a partir d'un FORM, à la suite de ca je texte si ya un fichier wait.txt sur c:\, si le fichier existe, je le delete et le precessus continue. si le fichier n'existe pas on entre dans une boucle d'attente
while (!@unlink($waitfile))
pendant cette boucle, j'envoi un "." toutes les 2 secondes :
sleep (2);
echo "<B>.</B> ";

tout marchait tres bien avant, maintenant, je reste sur la page du FORM et je recois lensemble de mes points au timeout.
alors quavant le form disparaissait et je voyais en "temps réél" avancer mes points.

qqun à une idée ? comment relgler ce probleme ou comment le contourner , en utilisant peu etre un autre type de file d'attente.
je vous paste mon code pour plus d'information:

-----boucle d'attente----------
if (isset($userfile)) {
$waitfile = "C:\wait.txt";
$poswait = 1;
while (!@unlink($waitfile))
{
if ($poswait == 1) echo "<div id=\"temp\" style=\"visibility: visible\">Wait another file is under analyse ";
sleep (2);
echo "<B>.</B> ";
$poswait++ ;
}
echo "</div>";
echo "<script>temp.style.visibility='hidden';</script>";
$poswait = 0;
.......à la suite de ca, le script continue........
}
-------------------------------------
-----Mon FORM--------------
printf("
<form enctype='multipart/form-data' action='$PHP_SELF' method='post'>
<input type='hidden' name='MAX_FILE_SIZE' value='1000000'>
<input name='userfile' type='file'>
<input type='submit' value='Send'>
</form>
");

-------------------------------------

j'espere que quelqu'un pourra m'aider ..
j'ai essayé en mettant un flush(); apres le echo "<B>.</B> ";
dans la boucle, mais cela ne change rien, les points arrivent en bloc au timeout.
un grand merci d'avance pour votre aide
bye
LA GLOBULE
le 12/10/2003 à 19:07
LA GLOBULE
J'ai pas compris ton truc de file d'attente :

"je m'explique, une 1ere personne upload un fichier a partir d'un FORM, à la suite de ca je texte si ya un fichier wait.txt sur c:\, si le fichier existe, je le delete et le precessus continue. si le fichier n'existe pas on entre dans une boucle d'attente"

Quand un mec upload un fichier, il passe avant tout le monde c'est ca ? ("si le fichier existe, je le delete et le precessus continue")
Et si le mec est tout seul, il attend ? ("si le fichier n'existe pas on entre dans une boucle d'attente").

Sinon, pour gerer ces problemes de file d'attente, php permet l'utilisation de sémaphores.

Mais j'ai peur que ton truc ne soit pas aussi complexe pour utiliser un semaphore. J'ai plus l'impression que ton truc, ben ca serait tout simplement un "aggrement d'affichage", non ?
plc2k
le 12/10/2003 à 20:37
plc2k
en fait apres l'upload d'un fichier, ya un script qui le traite et qui fait des input dans mysql, et je ne veu pas que plusieurs fichiers soient traité en meme temps , genre si 10 personnes upload en meme temps un fichier à analyser, ca fait 10 fichiers et donc 10 input de centaines de ligne en meme temps dans la db...
donc pour eviter ca, jai fait ce systeme de queue, qui permet de ne traiter qu'un fichier à la fois...
si tu as une autre idée pour faire ce genre de chose, je prend !!!
merci pour ton interet
LA GLOBULE
le 12/10/2003 à 22:29
LA GLOBULE
Dans ce cas, la solution la plus simple serait de creer un fichier texte (un peu comme tu as fais) des le debut de la page de traitement (genre verrou.txt) et de l'effacer au moment de la fin du traitement.
Naturellement,au debut du script, si le fichier verroy.txt existe deja, il faut que tu attendes que le fichier soit supprimé avant de pouvoir le recreer.

Mais cela peut poser plusieurs pb : un timeout, l'utilisateur qui ferme son browser alors que le script n'a pas encoire supprimé le fichier, etc...

Pour remedier à cela, tu peux aussi regarder la date de creation ce fichier : si elle est de 35 secondes (par exemple) anterieure à la date actuelle, ben tu peux effectuer l'upload (cela veut dire que le precedent upload a planté : un timeout arrivant en general au bout de 30 s).

Sinon, il doit surement exister d'autres systemes de verrou.
plc2k
le 13/10/2003 à 08:45
plc2k
oui ton system est equivalent a ce que je fais, effacer ou creer un fichier ca revien au meme, moi ce qui ne marche pas c pas ca, c'est laffichage des "." d'attente.
excuse moi si je ne me suis pas bien exprimé.
la queue des fichiers marche bien, c juste l'affichage du message + les .....
merci
a+
LA GLOBULE
le 13/10/2003 à 10:11
LA GLOBULE
Faudrait se tourner vers le javascript pour faire ecrire du texte au fur et à mesure que le script se charge.
plc2k
le 13/10/2003 à 21:10
plc2k
je viens de tester mon fichier php sur un easyphp 1.6 (qui comprend une ancienne version de php) et mon script marche impec,
just aprés le post de mon fichiern ma boucle se met en action, le form disparait pour laisser place à mon message d'attente et mes petits points toutes les 2 secondes.
j'ai installé easyphp 1.7 sur ce meme poste (qui contient donc la derniere version de php 4.2)
et la mon probleme se reproduit, le form ne disparait lpus apres le post, la boucle d'attente est bien activé mais jai pas mon message ni mes points, ils n'apparaissent qu'aprés le timeout et tous d'un coup.
ya pas une histoire de buffurisation dans le nouveau php ?.?
LA GLOBULE
le 13/10/2003 à 21:43
LA GLOBULE
La bufferisation existe en php, mais normalement, c'est toi qui decide de l'activer...
plc2k
le 13/10/2003 à 22:03
plc2k
oui je sais, c juste une piste ) car la je desespere je vois pas pourquoi avant ca marché et maintenant, non ..
qqun a fait les test ?
plc2k
le 14/10/2003 à 14:27
plc2k
Merci tomtom pour ton interet
j'ai testé ca na pas lair de marcher .
pouvons nous prendre le probleme differement ?
qqun peu til tester ca :

<?php
if (isset($userfile)) {
$waitfile = "C:\wait.txt";
$poswait = 0;
while (!@unlink($waitfile))
{
if ($poswait == 0) echo "<div id=\"temp\" style=\"visibility: visible\">Wait another file is under analyse ";
sleep (2);
echo "<B>.</B> ";
ob_end_flush();
$poswait++ ;
}
echo "</div>";
echo "<script>temp.style.visibility='hidden';</script>";
$poswait = 0;
}
else {

echo "<form enctype=\"multipart/form-data\" action=\"$PHP_SELF\" method=\"post\">";
echo "<input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"1000000\">";
echo "<input name=\"userfile\" type=\"file\">";
echo "<input type=\"submit\" value=\"Send\">";
echo "</form>";
}


?>

cela marche en php 3.x mais pas en php 4.2 ....
en fait mon unique probleme est la ...
l affichage de l'echo apres le poste n'apparait qu au timeout !
mon unique probleme est celui ci ..
un grand MERCI à tous ceux qui prenne 5 minutes de leur temps pour maider.
Répondre
LoadingChargement en cours