Maison > base de données > tutoriel mysql > Une explication des exemples d'utilisation de PHP flock

Une explication des exemples d'utilisation de PHP flock

jacklove
Libérer: 2018-06-09 11:04:43
original
2766 Les gens l'ont consulté

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 manuellement
bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
Copier après la connexion

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

b.php

Exécutez d'abord a.php, puis exécutez b.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;w&#39;);
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);
?>
Copier après la connexion

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 = &#39;test.txt&#39;;
$fp = fopen($file, &#39;r&#39;);
if(flock($fp, LOCK_SH)){ // 取得贡献锁
    while(!feof($fp)){
        echo fread($fp, 100);
    }
    flock($fp, LOCK_UN);
}
fclose($fp);
?>
Copier après la connexion

Exemple 2 : A et B utilisent tous deux des verrous partagés et ne bloquent pas

a.php

b.php

Exécutez d'abord a.php, puis exécutez b.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;r&#39;);
if(flock($fp, LOCK_SH)){ // 取得共享锁
    sleep(10);           // sleep 10秒
    while(!feof($fp)){
        echo fread($fp, 100);
    }
    flock($fp, LOCK_UN);
}
fclose($fp);
?>
Copier après la connexion

b peut afficher le contenu du fichier sans attendre la fin de l'exécution de a, ne bloque pas

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;r&#39;);
if(flock($fp, LOCK_SH)){ // 取得共享锁
    while(!feof($fp)){
        echo fread($fp, 100);
    }
    flock($fp, LOCK_UN);
}
fclose($fp);
?>
Copier après la connexion

Exemple 3 : A et B utilisent tous deux des verrous exclusifs pour écrire des fichiers, bloquant

a.php

b.php

Exécutez d'abord a.php, puis exécutez b.php
<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;a&#39;);
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);
?>
Copier après la connexion
Copier après la connexion

b doit attendre que a termine son exécution avant d'écrire données, bloque

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;a&#39;);
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);
?>
Copier après la connexion


Exemple 4 : LOCK_NB ne bloque pas et n'attend pas lorsqu'il est verrouillé

a.php

b.php

Exécutez d'abord a.php, puis exécutez b.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;a&#39;);
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);
?>
Copier après la connexion
Copier après la connexion

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 = &#39;test.txt&#39;;
$fp = fopen($file, &#39;a&#39;);
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 &#39;file locked&#39;;
}
fclose($fp);
?>
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal