Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
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 26/09/2011, 12h14   #1
Invité de passage
 
Inscription : septembre 2002
Messages : 25
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 25
Points : 4
Points : 4
Par défaut S'assurer de l'écriture séquentielle d'un fichier

Bonjour,

Il m'arrive de devoir faire appel 2 fois (successivement) à une fonction PHP qui modifie un fichier XML pour mise à jour.
Code :
$xml->load() --traitements-- $xml->save()
En théorie, tout se fait séquentiellement et le deuxième appel à la fonction ne devrait pas trouver le fichier XML ouvert.
Mais dans la pratique, je me demande, suite à une charge serveur ou autre, si on ne pourrait pas se trouver dans ce cas et que le deuxième traitement ne puisse aboutir.

Les rares discussions trouvées sur Internet ne parlent que de problèmes liés à l'upload de fichiers mais pour mon cas tout se passe en local sur le serveur.
Il existe bien la fonction flock() mais elle ne répond pas à mes besoins et a des limitations quand au système de fichiers FAT (l'appli tourne aussi sur clé USB).
A noter que le fichier XML est personnel à chaque utilisateur.

Je désire donc savoir si il est nécessaire de sécuriser ce traitement ou si PHP ne permettra pas ce genre de problème.
Si il faut sécuriser ce traitement, avez-vous des pistes à me fournir (on peut par exemple créer un fichier au début de la fonction, le supprimer à la fin et ne la lancer que si ce fichier est absent).

Merci d'avance.
bewonder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 12h18   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 126
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 126
Points : 8 484
Points : 8 484
créer un fichier .lock
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 12h50   #3
Invité de passage
 
Inscription : septembre 2002
Messages : 25
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 25
Points : 4
Points : 4
Tout d'abord merci stealth35 pour ta réponse.

Apparemment, il s'agit d'émuler la fonction flock() de PHP en utilisant un fichier (un peu comme je le sous-entendais).

Je ne sais pas si les fichiers .flock ont des méthodes spécifiques qui les gèrent (je sais qu'Apache les utilise mais PHP ?) mais j'ai déniché celà sur la toile : comment-utiliser-les-locks-avec-des-taches-cron-en-php

Me conseilles-tu de partir dans cette direction ?

Merci
bewonder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 13h09   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 126
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 126
Points : 8 484
Points : 8 484
un file_put_contents suffit, c'est un méthode toute simple
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 13h57   #5
Invité de passage
 
Inscription : septembre 2002
Messages : 25
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 25
Points : 4
Points : 4
Oui sauf qu'il ne s'agit pas d'une fonction atomique.

Il faudrait plutôt voir vers l'utilisation de rename(), quoique je ne suis pas certain de la conservation de cette propriété sous Windows.

Mais peut être suis-je en train de me prendre la tête pour un fichier qui, après tout, n'est accessible que par son utilisateur attitré.

Un simple fopen() en début de fonction suivi d'un fclose() et d'un unlink() en final devrait suffire pour ce cas.
bewonder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 14h03   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 126
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 126
Points : 8 484
Points : 8 484
Citation:
Envoyé par bewonder Voir le message
Mais peut être suis-je en train de me prendre la tête pour un fichier qui, après tout, n'est accessible que par son utilisateur attitré.
oui c'est plutôt ça
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 14h15   #7
Invité de passage
 
Inscription : septembre 2002
Messages : 25
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 25
Points : 4
Points : 4


Ok, je suis peut-être un peu parano sur ce coup là.

Je vais donc faire simple pour ce cas personnel.

Mais je serais curieux de dénicher une solution universelle car, bien que rarement abordé, le sujet peut vite devenir épineux.

En tout cas merci pour ton aide.
bewonder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 14h18   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 126
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 126
Points : 8 484
Points : 8 484
le sujet date
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 14h25   #9
Invité de passage
 
Inscription : septembre 2002
Messages : 25
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 25
Points : 4
Points : 4
Solution adoptée :

Un fichier A.TXT sera présent dans le dossier de l'utilisateur.

Au début de la fonction on teste si B.TXT existe.

Si il n'existe pas, on renomme A.TXT en B.TXT, on effectue les traitements et à la fin de la fonction on renomme B.TXT en A.TXT.

Si il existe, la fonction prévient le script (renvoit d'une valeur). On temporise avant de la relancer.

Pour éviter de boucler (au cas ou) on peut utiliser un compteur qui arrêtera l'appel au bout de n fois.
bewonder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 14h28   #10
Invité de passage
 
Inscription : septembre 2002
Messages : 25
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 25
Points : 4
Points : 4
Citation:
le sujet date
Oui, comme quoi... Certaines questions attendent toujours leur solution.
bewonder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 14h30   #11
Modérateur
 
Inscription : septembre 2010
Messages : 7 126
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 126
Points : 8 484
Points : 8 484
Citation:
Envoyé par bewonder Voir le message
Oui, comme quoi... Certaines questions attendent toujours leur solution.
résolu par un flock, d'ailleurs pourquoi tu ne veut pas faire un flock ?
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 14h54   #12
Invité de passage
 
Inscription : septembre 2002
Messages : 25
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 25
Points : 4
Points : 4
Premièrement flock() me fait peur car son utilisation implique certaines connaissances que je ne maîtrise pas ex :
Citation:
flock() utilise les verrous obligatoires sous Windows, qui sont aussi supportés sur Linux et les systèmes dérivés de System V au moyen de l'appel système fcntl(): si le fichier en question a le bit setgid positionné et le bit de groupe vide. Sur Linux, le système de fichiers devra être monté avec l'option mand pour que cela fonctionne.
Sic !

Deuxièmement, et toujours d'après la doc. officielle :
Citation:
flock() n'est pas supporté sur les vieux systèmes de fichiers comme FAT et ses dérivés, et elle retournera forcément FALSE sous ces environnements (ceci est particulièrement vrai pour les utilisateurs de Windows 98)
Or, l'appli sur laquelle je travaille tourne sur serveur mais aussi sur clés USB destinées à des artisans.

Je n'ose donc pas tenter le diable
bewonder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 14h57   #13
Modérateur
 
Inscription : septembre 2010
Messages : 7 126
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 126
Points : 8 484
Points : 8 484
je vois
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 14h59   #14
Invité de passage
 
Inscription : septembre 2002
Messages : 25
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 25
Points : 4
Points : 4
En tout cas merci encore
bewonder est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h11.


 
 
 
 
Partenaires

Hébergement Web