flock
(PHP 4, PHP 5)
flock — verrouillage léger des fichiers consultatifs
Description
bool flock ( int $handle , int $opération [, int &$wouldblock ] )
PHP prend en charge une méthode légère de verrouillage de tous les fichiers de manière consultative (c'est-à-dire que tous les programmes qui y accèdent doivent se verrouiller de la même manière, sinon cela ne fonctionnera pas).
Remarque :
flock() sera appliqué sous Windows.
Le handle de l’opération flock() doit être un pointeur de fichier ouvert. opération peut être l'une des valeurs suivantes :
Pour obtenir un verrou partagé (programme de lecture), définissez opération sur LOCK_SH (mis à 1 dans les versions antérieures à PHP 4.0.1).
Pour obtenir un verrou exclusif (programme d'écriture), définissez l'opération sur LOCK_EX (défini sur 2 dans les versions antérieures à PHP 4.0.1).
Pour libérer un verrou (qu'il soit partagé ou exclusif), définissez l'opération sur LOCK_UN (défini sur 3 dans les versions antérieures à PHP 4.0.1).
Si vous ne voulez pas que flock() se bloque lorsqu'il est verrouillé, ajoutez LOCK_NB à l'opération (défini sur 4 dans les versions antérieures à PHP 4.0.1).
flock() permet l'implémentation d'un modèle simple de lecture/écriture qui peut être utilisé sur n'importe quelle plateforme (y compris la plupart des dérivés d'Unix et même Windows). Le troisième paramètre facultatif est défini sur TRUE si le verrou bloque (en cas de code d'erreur EWOULDBLOCK). Les opérations de verrouillage peuvent également être libérées par fclose() (également appelée automatiquement lorsque l'exécution du code est terminée).
Renvoie VRAI en cas de succès, ou FAUX en cas d'échec
Exemple n°1 flock() Exemple
Copier le code<.>
Le code est le suivant :
$fp = fopen("/tmp/lock.txt", "w+"); 🎜 >if (flock($fp, LOCK_EX)) { // effectue un verrouillage exclusif
fwrite($fp, "Écrivez quelque chose ici ");
flock($fp, LOCK_UN); >} else {
echo "Impossible de verrouiller le fichier !"
}
fclose($fp);
?> >
Comme flock() nécessite un pointeur de fichier, vous devrez peut-être utiliser un fichier de verrouillage spécial pour protéger l'accès aux fichiers destinés à être ouverts en mode écriture (ajoutez "w" ou "w+" à la fonction fopen()) .
Attention
flock() ne peut pas être utilisé avec NFS et certains autres systèmes de fichiers réseau. Consultez la documentation de votre système d'exploitation pour plus de détails.
Dans certains systèmes d'exploitation, flock() est implémenté au niveau du processus. Lors de l'utilisation d'une API de serveur multithread (telle qu'ISAPI), il peut ne pas être possible de s'appuyer sur flock() pour protéger le fichier, car le fichier peut être traité par des scripts PHP exécutés dans d'autres threads parallèles dans la même instance de serveur.
flock() ne prend pas en charge les anciens systèmes de fichiers tels que FAT et ses dérivés. Par conséquent, FALSE est toujours renvoyé dans cet environnement (en particulier pour les utilisateurs de Windows 98).
Introduction à l'utilisation de la fonction de verrouillage de fichier flock en php :
Syntaxe : bool flock (int $handle, int $operation [, int & $wouldblock ] )
Le handle de l'opération flock() doit être un pointeur de fichier ouvert. opération peut être l'une des valeurs suivantes :
1. Pour obtenir un verrou partagé (lecteur), définissez opération sur LOCK_SH (défini sur 1 dans les versions antérieures à PHP 4.0.1)
2. ( Writer), définissez l'opération sur LOCK_EX (défini sur 2 dans les versions antérieures à PHP 4.0.1)
3. Pour libérer le verrou (qu'il soit partagé ou exclusif), définissez l'opération sur LOCK_UN (dans les versions antérieures à PHP 4.0.1) Définissez à 3 dans la version)
4. Si vous ne voulez pas que flock() se bloque lorsqu'il est verrouillé, ajoutez LOCK_NB à l'opération (défini à 4 dans les versions antérieures à PHP 4.0.1)
Voir ci-dessous Code :
a.php
< ;?php
$file = "temp.txt";
$fp = fopen($file, 'w');
if(flock($fp, LOCK_EX)){
fwrite( $fp, "abc");
sleep(10);
fwrite($fp, "123");
flock($fp, LOCK_UN); fclose($ fp);
?>
b.php
Copier le code
$fp = fopen($file, 'r'); echo fread($fp, 100);
fclose($fp);
?>
运行 a.php 后,马上运行 b.php ,可以看到输出:
abc
等 a.php 运行完后运行 b.php ,可以看到输出:
abc
123
显然,当 a.php 写文件时数据太大,导致时间比较长时,这时 b.php 读取数据不完整,在对b.php做修改
修改 b.php 为:
$file = “temp.txt”;
$fp = fopen($file , 'r‘);
if(flock($fp , LOCK_EX)){
echo fread($fp , 100);
flock($fp , LOCK_UN);
} else{
echo “Lock file failed…”;
}
fclose($fp);
?>
运行 a.php 后,马上运行 b.php ,可以发现 b.php 会等到 a.php 运行完成后(即 10 秒后)才显示:
abc
123
读取数据完整,但时间过长,他要等待写锁释放,再对b.php做修改。
修改 b.php 为:
$file = “temp.txt”;
$fp = fopen($file , 'r');
if(flock($fp , LOCK_SH | LOCK_NB)){
echo fread($fp , 100);
flock($fp , LOCK_UN);
} else{
echo “Lock file failed…”;
}
fclose($fp);
?>
运行 a.php 后,马上运行 b.php ,可以看到输出:
Lock file failed…
证明可以返回锁文件失败状态,而不是向上面一样要等很久。
脚本之家小编结论:
建议作文件缓存时,选好相关的锁,不然可能导致读取数据不完整,或重复写入数据。
file_get_contents 好像选择不了锁,不知道他默认用的什么锁,反正和不锁得到的输出一样,是不完整的数据。