• [^] # Re: exclusion mutuelle !!

    Posté par (site web personnel) . En réponse au message PHP: Lock sur le system de fichier ?. Évalué à 2.

    > y a moyen d avoir un jeton exclusif ?

    L'exemple 1 de la doc fait justement ça. Il est exclusif (en gros ton process attend que l'autre ait finit pour jouer à son tour).


    > je capte pas la difference entre shared et non blocking ... quelqu un pour aider ?

    Tu as l'opposition exclusif / partagé (shared) et l'opposition bloquant / non bloquant (non blocking).


    Exclusif c'est quand tu veux un accès unique (généralement pour de l'écriture) : personne d'autre n'a le droit de toucher au fichier quand tu as le verrou exclusif. Partagé c'est généralement pour de la lecture : tu veux bien que plusieurs process lisent le fichier en même temps (pas besoin qu'ils fassent la queue, tu peux obtenir un verrou partagé si quelqu'un en a déjà un) mais pas qu'ils lisent pendant qu'un autre écrit (donc tu ne peux pas obtenir un verrou partagé si quelqu'un en a demandé un exclusif).
    En règle générale tu peux traduire exclusif par "écriture" et partagé par "lecture"

    Bloquant ou non bloquant c'est pour savoir ce que tu fais quand tu ne peux pas avoir le verrou demandé. Le mode bloquant dit "je lis/ecris, j'attendrai le temps qu'il faudra pour ça mais je vais jusqu'au bout". Le mode non bloquant dit "je lis si dispo, sinon j'annule et je reprend la main pour autre chose".


    - écriture non bloquant : j'écris si c'est dispo, j'annule sinon
    $fp = fopen("monfichier", "a") ;
    $libre = flock($fp, LOCK_EX|LOCK_NB) ;
    if (!$libre) {
    fclose($fp) ;
    echo "pas de verrou, on annule et on fait autre chose" ;
    } else {
    fwrite($fp, "ok, j'écris") ;
    fclose($fp) ;
    echo "fichier modifié" ;
    }

    - lecture bloquant : je lis, j'attend le temps qu'il faudra mais je lis
    $fp = fopen("monfichier", "r") ;
    flock($fp, LOCK_SH) ;
    if (!$libre) {
    fclose($fp) ;
    echo "pb d'accès au fichier" ;
    } else {
    $line = fgets($fp, 1024) ;
    fclose($fp) ;
    echo "j'ai lu : $line" ;
    }