Helper Lock


1Présentation

Helper servant à verrouiller l'accès à un fichier. Si aucun fichier n'est spécifié, c'est le script PHP en cours d'exécution qui sera verrouillé.

L'objet peut être appelé de deux manières différentes, soit en l'instanciant classiquement, soit en faisant appel à des méthodes statiques.
Chaque solution s'utilise de manière différente :

  • Instanciation : Par défaut, le verrouillage est bloquant (si le fichier est déjà verrouillé, l'objet attend qu'il soit libéré pour le verrouiller à son tour, puis rendre la main). Pour déverrouiller le fichier, il faut détruire l'instance de l'objet.
  • Appels statiques : Par défaut, le verrouillage est non bloquant (si le fichier est déjà verrouillé, la fonction retourne false immédiatement). Pour déverrouiller le fichier, il faut appeler une autre fonction statique, en lui fournissant de nouveau le chemin du fichier qui était verrouillé.

Les fichiers encore verrouillés à la fin de l'exécution du script sont automatiquement déverrouillés. Il n'est donc pas toujours nécessaire de les déverrouiller explicitement.


2Appels statiques

La manière la plus simple de verrouiller (de manière non bloquante) l'exécution d'un script est d'écrire le code suivant :

use \Temma\Utils\Lock as TµLock;

if (!TµLock::lock()) {
    // le programme est déjà en cours d'exécution
    exit();
}
// reste du script

Pour verrouiller un fichier spécifique de manière bloquante, et le déverrouiller plus tard :

use \Temma\Utils\Lock as TµLock;

TµLock::lock('/chemin/vers/fichier', true);
// ... code applicatif
TµLog::unlock('/chemin/vers/fichier');

3Instanciation

Pour verrouiller de manière bloquante l'accès à un fichier, et le déverrouiller plus tard :

use \Temma\Utils\Lock as TµLock;

// verrouillage du fichier
try {
    $lock = new TµLock('/path/to/file');
} catch (\Temma\Exceptions\IO $eio) {
    // il y a eu une erreur
}
// ... utilisation du fichier
// déverrouillage
unset($lock);

Pour verrouiller l'accès à un fichier de manière non bloquante, et le déverrouiller plus tard :

use \Temma\Utils\Lock as TµLock;

// verrouillage du fichier
try {
    $lock = new TµLock('/path/to/file', false);
} catch (\Temma\Exceptions\IO $eio) {
    // il y a eu une erreur
} catch (\Temma\Exceptions\Application $ea) {
    // le fichier est déjà verrouillé
}
// ... utilisation du fichier
// déverrouillage
unset($lock);