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

Une explication des exemples d'utilisation de PHP flock

jacklove
jackloveoriginal
2018-06-09 11:04:432702parcourir

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 ] )

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);
?>

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);
?>

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);
?>

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.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);
?>

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);
?>


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);
?>

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);
?>

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!

Déclaration:
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