Maison > Article > base de données > Une explication des exemples d'utilisation de PHP flock
Exemple d'utilisation de php flock Le modèle de lecture/écriture utilisé (y compris la plupart des dérivés Unix et Windows)
Avant PHP 5.3.2, les verrous étaient bloqués par fclose()
Release (appelée automatiquement après la fin du script), doit maintenant être déverrouillée manuellementbool flock ( resource $handle , int $operation [, int &$wouldblock ] )
opération
1.LOCK_SHObtenir un verrou partagé (programme de lecture)
2.LOCK_EXObtenir un verrou exclusif (programme d'écriture)
3.LOCK_UN Libérer le verrou (qu'il soit partagé ou exclusif)
4.LOCK_NB Verrouillé dans flock() Ne bloque pas quand
Exemple 1 : A utilise un verrou exclusif pour écrire le fichier, B lit le fichier, bloquant
a.php
Exécutez d'abord a.php, puis exécutez b.php
<?php $file = 'test.txt'; $fp = fopen($file, 'w'); if(flock($fp, LOCK_EX)){ // 取得独占锁 fwrite($fp, "Hello World\r\n"); // 写入数据 sleep(10); // sleep 10秒,文件被锁定 fwrite($fp, "Hello PHP\r\n"); // 写入数据 flock($fp, LOCK_UN); // 解锁 } fclose($fp); ?>
a obtient le verrou exclusif, b ne peut qu'attendre et ne peut exécuter b qu'après l'exécution de a et le déverrouillage du verrou , Blocage
<?php $file = 'test.txt'; $fp = fopen($file, 'r'); if(flock($fp, LOCK_SH)){ // 取得贡献锁 while(!feof($fp)){ echo fread($fp, 100); } flock($fp, LOCK_UN); } fclose($fp); ?>
Exemple 2 : A et B utilisent tous deux des verrous partagés et ne bloquent pas
a.phpExécutez d'abord a.php, puis exécutez b.php
<?php $file = 'test.txt'; $fp = fopen($file, 'r'); if(flock($fp, LOCK_SH)){ // 取得共享锁 sleep(10); // sleep 10秒 while(!feof($fp)){ echo fread($fp, 100); } flock($fp, LOCK_UN); } fclose($fp); ?>
b peut afficher le contenu du fichier sans attendre la fin de l'exécution de a, ne bloque pas
6881d79e58a19bf081508955ca08811c
Exemple 3 : A et B utilisent tous deux des verrous exclusifs pour écrire des fichiers, bloquant
a.phpExécutez d'abord a.php, puis exécutez b.php
<?php $file = 'test.txt'; $fp = fopen($file, 'a'); if(flock($fp, LOCK_EX)){ // 取得独占锁 fwrite($fp, "Hello World\r\n"); // 写入数据 sleep(10); // sleep 10秒,文件被锁定 fwrite($fp, "Hello PHP\r\n"); // 写入数据 flock($fp, LOCK_UN); // 解锁 } fclose($fp); ?>
b doit attendre que a termine son exécution avant d'écrire données, bloque
<?php $file = 'test.txt'; $fp = fopen($file, 'a'); if(flock($fp, LOCK_EX)){ // 取得独占锁 fwrite($fp, "How Are You\r\n"); // 写入数据 fwrite($fp, "Show Me The Money\r\n"); // 写入数据 flock($fp, LOCK_UN); // 解锁 } fclose($fp); ?>
Exemple 4 : LOCK_NB ne bloque pas et n'attend pas lorsqu'il est verrouillé
a.phpExécutez d'abord a.php, puis exécutez b.php
<?php $file = 'test.txt'; $fp = fopen($file, 'a'); if(flock($fp, LOCK_EX)){ // 取得独占锁 fwrite($fp, "Hello World\r\n"); // 写入数据 sleep(10); // sleep 10秒,文件被锁定 fwrite($fp, "Hello PHP\r\n"); // 写入数据 flock($fp, LOCK_UN); // 解锁 } fclose($fp); ?>
b ne peut pas obtenir le verrou exclusif. Il n'est pas nécessaire d'attendre a pour. termine l'exécution, mais renvoie directement l'invite indiquant que le verrou ne peut pas être obtenu, Non bloquant
<?php $file = 'test.txt'; $fp = fopen($file, 'a'); if(flock($fp, LOCK_EX|LOCK_NB)){ // 取得独占锁 fwrite($fp, "How Are You\r\n"); // 写入数据 fwrite($fp, "Show Me The Money\r\n"); // 写入数据 flock($fp, LOCK_UN); // 解锁 }else{ echo 'file locked'; } fclose($fp); ?>
Résumé :
Utilisez les verrous partagés LOCK_SH, s'il est en train de lire, il n'est pas nécessaire d'attendre, mais s'il est en train d'écrire, vous devez attendre la fin de la lecture .
Utilisez le verrouillage exclusif LOCK_EX, l'écriture/lecture doit attendre.
LOCK_UN, que des verrous partagés/occupés en lecture soient utilisés ou non, ils doivent être déverrouillés après utilisation.
LOCK_NB, lorsqu'il est verrouillé, ne bloque pas, mais demande le verrouillage.
Cet article explique les exemples d'utilisation de php flock Pour plus de contenu connexe, veuillez faire attention au site Web chinois de php.
Recommandations associées :
Explication de la méthode de remplacement php str_replace pour des heures spécifiées
Instructions d'utilisation de header, headers_sent, headers_list, header_remove
Solution pour changer le type de champ entier renvoyé par la requête PDO mysql en type String
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!