OVH Cloud OVH Cloud

Tester si un fichier est en cours d'ecriture

5 réponses
Avatar
Rhikio
Bonjour,

J'ai un script PHP qui tourne et qui regarde si qqun a déposé un fichier sur
un serveur FTP.
Dès qu'un fichier est déposé, mon script l'ouvre en lecture et traite les
données.
Or, je me suis apercu qu'apparemment, mon script ouvre le fichier alors meme
que le transfert FTP soit fini. Donc, il ne contient pas toutes les données.
Comment voir s'il est utilisé ?
Merci !

5 réponses

Avatar
John Gallet
Bonjour,

Or, je me suis apercu qu'apparemment, mon script ouvre le fichier alors meme
que le transfert FTP soit fini. Donc, il ne contient pas toutes les données.


Ultra classique. Tu as tout simplement oublié que transférer des
données, ça prend du temps.

Comment voir s'il est utilisé ?


Beaucoup trop compliqué à faire par rapport à une autre solution simple.
Il suffit de systématiquement transférer un fichier vide marquant la fin
du transfert du fichier de données après son transfert. Tu scrutes ce
fichier vide. Dès que tu le vois, tu le détruis. Puis tu traites ton
fichier de données. Eventuellement tu peux te servir du fichier flag, de
nom constant, pour véhiculer le nom du fichier à traiter et son format
(compressé ou non par exemple).

Néanmoins, il y a probablement des bidouilles faisables en php, à grands
coups de system/exec par exemple.

a++
JG

Avatar
Stephane Pineau
Le 09 Jul 2004 15:03:59 GMT, John Gallet écrivait:

Beaucoup trop compliqué à faire par rapport à une autre solution simple.
Il suffit de systématiquement transférer un fichier vide marquant la fin
du transfert du fichier de données après son transfert.


C'est la 1ère idée qui m'est également venue, d'un autre côté demander
l'envoi de deux fichiers dont l'un d'un nom précis ca risque d'être coton et
sans garanti que le 2nd fichier sera tj envoyer.
.
La deuxième solution que j'envisagerai, vu qu'il doit s'agir d'un script
tournant en daemon, c'est de
* relever lorsqu'un nouveau fichier est détecté sa taille et la mémoriser,
* au run suivant mettons toutes les 1mn (pas moins en tout cas) on relève de
nouveau la taille, si elle a changé on mémoirise cette nouvelle valeur on
considère que le fichier est tj en cours d'upload, on attend le run suivant
* Si la taille n'a pas changé au bout de 2 run consécutifs on considère que
le fichier est bon à traiter.

C'est à tester, parceque je ne sais pas ce que retourne comme taille la
fonction qui va bien sur un fichier en cours de création (Sous Win je serais
pas étonné qu'elle retourne tj 0 tant que le fichier n'est pas fermé, mais
dans ce cas là ca simplfie le problème, puisque tant que la taille du
fichier est à 0 on ne traite pas, point barre).

Cdlt,
Stéph'

--
AcroDict : Dictionnaire francophone des acronymes informatiques
<URL:http://www.teaser.fr/~spineau/acrodict/index.htm>
PHP Page : Script PHP3 Gratuits (Forum, Gestionnaires BDD, etc..)
<URL:http://steph.pineau.free.fr/php/index.php>

Avatar
John Gallet
Bonsoir,

C'est la 1ère idée qui m'est également venue, d'un autre côté demander
l'envoi de deux fichiers dont l'un d'un nom précis ca risque d'être coton
et

sans garanti que le 2nd fichier sera tj envoyer.


Ca tourne comme ça tous les jours de bourse ouvrés sur une quarantaine de
site de productions que je connais pour 5 à 10 fichiers par jour depuis des
années, on a jamais eu de problème lié à ce mécanisme.

* relever lorsqu'un nouveau fichier est détecté sa taille et la mémoriser,
* au run suivant mettons toutes les 1mn (pas moins en tout cas) on relève
de

nouveau la taille, si elle a changé on mémoirise cette nouvelle valeur on
considère que le fichier est tj en cours d'upload, on attend le run
suivant

* Si la taille n'a pas changé au bout de 2 run consécutifs on considère que
le fichier est bon à traiter.



Et si manque de bol le transfert a échoué et est en cours de reprise, t'es à
poil. Been there, done that, got the tshirt.

Si le gars qui te fait l'upload veut bien faire un touch du deuxième
fichier, c'est beaucoup plus robuste. Du moment qu'il commence par un nom
différent du fichier de data (préfixe constant), on peut ensuite le mettre
dans un répertoire spécifique et se passer d'un nom constant, même si ça
simplifie. De plus, ce n'est pas compliqué d'avoir toujours le même nom.
Sinon, ta méthode est la moins pire en numéro deux.

a++
JG

Avatar
Marc
Rhikio wrote:
Bonjour,

J'ai un script PHP qui tourne et qui regarde si qqun a déposé un fichier sur
un serveur FTP.
Dès qu'un fichier est déposé, mon script l'ouvre en lecture et traite les
données.
Or, je me suis apercu qu'apparemment, mon script ouvre le fichier alors meme
que le transfert FTP soit fini. Donc, il ne contient pas toutes les données.
Comment voir s'il est utilisé ?
Merci !


est-ce que ce n'est pas le cas typique de l'utilisation d'un verrou de
fichier ? (flock) ?

Avatar
John Gallet
Re,

est-ce que ce n'est pas le cas typique de l'utilisation d'un verrou de
fichier ? (flock) ?


Selon ce que j'en ai compris, le ficheir arrive en PUT depuis un serveur
distant. Si on fait ça en GET depuis le serveur local, il n'est pas
difficile de lancer le script php au bon moment.

Donc si tu arrives à garantir que l'application extérieure (sur unix
(x)inetd passant la main à ftpd en l'occurence) l'utilisera comme toi,
alors oui. Il faudrait faire un test avec un fichier
méga-maousse-costaud pour avoir le temps de lancer le script
tranquillement et de regarder comment c'est géré. Et revérifier le jour
où tu changes d'OS... Bref, les verrous sur fichier c'est (parfois) bien
mais surtout pour synchroniser des applications sur lesquelles tu as la
main de bout en bout. Pour le reste j'ai un peu peur. Autre chose :
vérifier que le lock est supprimé en cas de plantage du programme, et
c'est pas nécessairement évident.

a++
JG