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 :

S'assurer de l'écriture séquentielle d'un fichier


Sujet :

Langage PHP

  1. #1
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    créer un fichier .lock

  3. #3
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par défaut
    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

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    un file_put_contents suffit, c'est un méthode toute simple

  5. #5
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par défaut
    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.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    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

  7. #7
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par défaut


    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.

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    le sujet date

  9. #9
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par défaut
    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.

  10. #10
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par défaut
    le sujet date
    Oui, comme quoi... Certaines questions attendent toujours leur solution.

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    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 ?

  12. #12
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par défaut
    Premièrement flock() me fait peur car son utilisation implique certaines connaissances que je ne maîtrise pas ex :
    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 :
    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

  13. #13
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    je vois

  14. #14
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par défaut
    En tout cas merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/02/2015, 12h04
  2. Écriture en début de fichier sans écrasement
    Par Rolf-IV dans le forum Langage
    Réponses: 2
    Dernier message: 12/07/2007, 13h14
  3. [POI] Problème écriture/lecture dans un fichier Excel
    Par steuve dans le forum Documents
    Réponses: 6
    Dernier message: 02/07/2007, 15h47
  4. écriture/lecture dans des fichiers
    Par rafale001 dans le forum C
    Réponses: 14
    Dernier message: 02/03/2007, 16h59
  5. écritures concurrentes dans un fichier
    Par djmalo dans le forum C
    Réponses: 9
    Dernier message: 06/03/2005, 01h45

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