Maison >développement back-end >Problème PHP >PHP connaît-il les verrous de fichiers ? A quoi ça sert ?

PHP connaît-il les verrous de fichiers ? A quoi ça sert ?

青灯夜游
青灯夜游original
2021-08-06 18:05:543731parcourir

Dans l'article précédent, nous avons présenté comment utiliser PHP pour obtenir des fichiers dans le répertoire spécifié (à l'exclusion des sous-répertoires). Si vous en avez besoin, veuillez lire "Comment PHP sait-il quels fichiers se trouvent dans le répertoire spécifié". Cette fois, nous allons vous présenter le verrouillage de fichier, examiner la fonction du verrouillage de fichier et comment ajouter un verrouillage de fichier et libérer le verrouillage de fichier.

Dans l'article précédent "Opération sur le fichier php : Comment effacer le fichier et rajouter des données", nous avons présenté la méthode d'écriture des données dans le fichier. Dans l'article, nous sommes un utilisateur unique exploitant le fichier en même temps. le temps, donc il n'y a pas de problème. Cependant, si dans un environnement réseau, plusieurs utilisateurs clients accèdent simultanément au même fichier sur le serveur, le programme contiendra des erreurs et le fichier risque d'être endommagé.

Par exemple :

  • Un utilisateur est en train d'écrire des données dans un fichier (les données ne sont pas encore terminées) ;

  • Ou, si un autre utilisateur obtient le contenu de ce fichier avant que l'utilisateur n'ait fini d'écrire les données, alors les données obtenues par l'utilisateur seront incomplètes et entraîneront des données incomplètes.
  • Pour résoudre ce problème, PHP fournit la fonction flock() - un mécanisme de verrouillage de fichiers qui peut verrouiller ou libérer des fichiers.

Lors de l'écriture dans un fichier à l'aide de PHP, le fichier est temporairement verrouillé seulement une fois le verrou libéré, d'autres utilisateurs peuvent utiliser le fichier. Cela évite la corruption des données lors d'un accès simultané au même fichier.

Regardons l'exemple suivant :

<?php
header("Content-Type: text/html;charset=utf-8");    //设置字符编码
$file = "test.txt";
$handle = fopen($file,&#39;w+&#39;); //打开文件
if(flock($handle, LOCK_EX|LOCK_NB)){  //给文件上锁
    fwrite($handle, &#39;现在是:&#39;.date(&#39;Y-m-d H:i:s&#39;, time()));  //写入数据
    flock($handle, LOCK_UN);  //释放文件锁
}else{
    echo "string";
}
fclose($handle);//关闭文件
readfile($file);//读取文件内容
?>

Analysez le code ci-dessus :

Utilisez d'abord la fonction fopen() pour ouvrir un fichier. Utilisez ensuite l'instruction flock($handle, LOCK_EX|LOCK_NB) pour ajouter un verrou exclusif "LOCK_EX" au fichier, et définissez "LOCK_NB" pour éviter de bloquer d'autres processus lorsqu'ils sont verrouillés et renvoyer directement le contenu. dans d'autre. Ensuite, vous pouvez utiliser la fonction fwrite() pour effectuer une opération d'écriture et écrire l'heure actuelle.

Une fois le fichier exploité, vous devez utiliser la fonction fclose() pour fermer le fichier ; enfin, utilisez la fonction readfile() pour lire le contenu du fichier. Le résultat de sortie est donc : flock($handle, LOCK_EX|LOCK_NB)语句给文件加一个“LOCK_EX”独占锁,且设置“LOCK_NB”在锁定的情况下避免阻塞其他进程,直接返回else中的内容。接着就可以使用fwrite()函数进行写入操作,写入当前的时间了。

文件操作好后,就需要使用fclose()函数来关闭文件;最后使用readfile()函数读取文件内容。因此输出结果为:

PHP connaît-il les verrous de fichiers ? A quoi ça sert ?

下面我们来简单了解一下flock()函数。

flock($file,$lock,$block)函数接受了2个必需参数$file(需要加锁/解锁的打开文件)和$lock(锁定类型)和一个可省略的参数$block(当值设置为1 或 true时,可在文件锁定时堵塞其它进程)。

$lock参数用于设置文件锁类型,可以设置一个或多个以下值(多个值需要使用|来分隔):

  • LOCK_SH - 共享锁定(读取的程序)。允许其他进程访问该文件。

  • LOCK_EX - 独占锁定(写入的程序)。防止其他进程访问该文件。

  • LOCK_UN - 释放一个共享锁定或独占锁定

  • LOCK_NB

    PHP connaît-il les verrous de fichiers ? A quoi ça sert ?
Jetons un bref aperçu de la fonction flock().

La fonction flock($file,$lock,$block) accepte 2 paramètres requis $file (fichier ouvert qui doit être verrouillé/déverrouillé) et $ lock (type de verrouillage) et un paramètre omis $block (lorsque la valeur est définie sur 1 ou true, d'autres processus peuvent être bloqués lorsque le fichier est verrouillé).
Le paramètre $lock est utilisé pour définir le type de verrouillage de fichier. Vous pouvez définir une ou plusieurs des valeurs suivantes (plusieurs valeurs doivent être séparées par |) :

LOCK_SH - Verrouillage partagé (programme de lecture). Autorisez d’autres processus à accéder au fichier. LOCK_EX - Verrouillage exclusif (programme écrit). Empêchez d’autres processus d’accéder au fichier.

🎜🎜🎜LOCK_UN - Libérez un verrou partagé ou exclusif 🎜🎜🎜🎜LOCK_NB - Évitez de bloquer d'autres processus en cas de verrouillage. 🎜🎜🎜🎜D'accord, c'est tout. Si vous voulez savoir autre chose, vous pouvez cliquer ici. → →🎜Fonctionnement de base des fichiers PHP🎜🎜🎜🎜🎜Recommandé :🎜"🎜Collection de questions d'entretien PHP (collection)🎜" "🎜Tutoriel vidéo PHP🎜"🎜

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