flock
(PHP 4, PHP 5, PHP 7)
flock — Verrouille le fichier
Description
$handle
, int $operation
[, int &$wouldblock
] )flock() permet de réaliser un système simple de verrous écriture/lecture, qui peut être utilisé sur n'importe quelle plate-forme (Unix et Windows compris).
Avant PHP 5.3.2, le verrou est également levé avec la fonction fclose() (qui est également automatiquement appelée lors de la fin du script).
PHP dispose d'un système complet de verrouillage de fichiers.
Tous les programmes qui accèdent au fichier doivent utiliser la
même méthode de verrouillage pour qu'il soit efficace. Par
défaut, cette fonction se bloquera tant que le verrou demandé
ne sera pas acquis ; ce comportement peut être contrôlé avec l'option LOCK_NB
dont vous trouverez la documentation ci-dessous.
Liste de paramètres
-
handle
-
Un pointeur de système de fichiers de type resource qui est habituellement créé en utilisant la fonction fopen().
-
operation
-
operation
peut prendre une des valeurs suivantes :-
LOCK_SH
pour acquérir un verrou partagé (lecture). -
LOCK_EX
pour acquérir un verrou exclusif (écriture). -
LOCK_UN
pour libérer un verrou (partagé ou exclusif).
Il est également possible d'ajouter
LOCK_NB
comme masque d'une des opérations précédentes si vous ne voulez pas que la fonction flock() bloque durant le verrouillage. -
-
wouldblock
-
Ce troisième argument optionnel est défini à 1 si le verrou doit bloquer le script (condition d'erreur EWOULDBLOCK).
Historique
Version | Description |
---|---|
5.5.22, 5.6.6 |
Ajout du support du paramètre wouldblock
sous Windows.
|
5.3.2 | Le déverrouillage automatique lorsque la ressource de fichiers est fermée a été supprimée. Le déverrouillage doit maintenant être effectuée manuellement. |
Exemples
Exemple #1 Exemple avec flock()
<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // acquière un verrou exclusif
ftruncate($fp, 0); // effacement du contenu
fwrite($fp, "Écrire dans un fichier\n");
fflush($fp); // libère le contenu avant d'enlever le verrou
flock($fp, LOCK_UN); // Enlève le verrou
} else {
echo "Impossible de verrouiller le fichier !";
}
fclose($fp);
?>
Exemple #2 Exemple avec flock() en utilisant l'option LOCK_NB
<?php
$fp = fopen('/tmp/lock.txt', 'r+');
/* Activation de l'option LOCK_NB lors d'une opération LOCK_EX */
if(!flock($fp, LOCK_EX | LOCK_NB)) {
echo 'Impossible d\'obtenir le verrou';
exit(-1);
}
/* ... */
fclose($fp);
?>
Notes
Note:
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.
Note:
Comme flock() requiert un pointeur de fichier, vous aurez peut être à utiliser un verrou spécial pour protéger l'accès au fichier que vous voulez tronquer en l'ouvrant en mode d'écriture (avec "w" ou "w+" comme argument de fopen()).
Note:
Ne devrait être utilisé que sur des ressources issues de fopen() pour des fichiers locaux ou via le gestionnaire de flux personnalisé en définissant streamWrapper::stream_lock().
Assigner une autre valeur à l'argument handle
dans ce code libèrera le verrou.
Sur certains systèmes d'exploitation, flock() est implémenté au niveau processus. Lorsque vous utilisez une API multithread comme ISAPI, vous risquez de ne pas pouvoir avoir confiance en flock() pour protéger vos fichiers contre d'autres scripts PHP qui fonctionnent en parallèle sur d'autres threads du même serveur.
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.
Version en cache
22/11/2024 21:20:42 Cette version de la page est en cache (à la date du 22/11/2024 21:20:42) afin d'accélérer le traitement. Vous pouvez activer le mode utilisateur dans le menu en haut pour afficher la dernère version de la page.Document créé le 30/01/2003, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/php-rf-flock.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.
Références
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.