PHP使用flock实现文件加锁的方法

   本文实例讲述了PHP使用flock实现文件加锁的方法。分享给大家供大家参考。具体分析如下:

  flock在官方文档里的解释是:flock() 允许你执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是Windows)。如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),请将可选的第三个参数设置为 TRUE。锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用)。

  简单来说,就是对一个文件进行锁定操作,使得多进程访问该文件时受到限制,从而防止冲突。举个例子:

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13

<?php
$file = fopen("test.txt","w+");
if (flock($file,LOCK_EX))
{
fwrite($file,"Write something");
flock($file,LOCK_UN);
}
else
{
echo "Error locking file!";
}
fclose($file);
?>

  说明:

  1.这段代码的意思是,以读写方式打开文件test.txt,当一个用户调用该php页面时,即对test.txt文件进行操作,那么就会执行flock($file,LOCK_EX)代码,即将test.txt文件进行独占锁定(该文件只能由该用户进行读写操作),那么如果有其他新的用户想访问该文件,就会被阻塞,直到前者关闭文件(释放锁定)。

  2.如果将代码改成flock($file,LOCK_EX+LOCK_NB)表示锁定时直接返回错误,那么如果有新的用户访问该文件,就会输出“Error locking file!”

  3.该函数的语法是flock(file,lock,block),其中file必需。规定要锁定或释放的已打开的文件。lock 必需。规定要使用哪种锁定类型。block可选。若设置为 1 或 true,则当进行锁定时阻挡其他进程。

  例如:请写一段PHP代码,确保多个进程同时写入同一个文件成功

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

function writeData($path, $mode,$data)
{
$fp = fopen($path, $mode);
$retries = 0;
$max_retries = 100;
do{
if ($retries > 0)
{
usleep(rand(1, 10000));
}
$retries += 1;
}while (!flock($fp, LOCK_EX) and $retries<= $max_retries);
if ($retries == $max_retries)
{
return false;
}
fwrite($fp, "$datan");
flock($fp, LOCK_UN);
fclose($fp);
return true;
}

  希望本文所述对大家的php程序设计有所帮助。

时间: 2024-11-01 19:25:44

PHP使用flock实现文件加锁的方法的相关文章

PHP使用flock实现文件加锁的方法_php技巧

本文实例讲述了PHP使用flock实现文件加锁的方法.分享给大家供大家参考.具体分析如下: flock在官方文档里的解释是:flock() 允许你执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是Windows).如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),请将可选的第三个参数设置为 TRUE.锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用). 简单来说,就是对一个文件进行锁定操作,使得多进程访问该文件时受到限制,从而

java对文件加锁

在对文件操作过程中,有时候需要对文件进行加锁操作,防止其他线程访问该文件.对文件的加锁方法有两种: 第一种方法:使用RandomAccessFile类操作文件. 在java.io.RandomAccessFile类的open方法,提供了参数实现独占的方式打开文件:         RandomAccessFile raf = new RandomAccessFile(file, "rws"); 其中的"rws"参数,rw代表读取和写入,s代表了同步方式,也就是同步锁

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.6.3 文件加锁机制

2.6.3 文件加锁机制 考虑一下多个同时执行的程序需要修改同一个文件的情形,很明显,这些程序需要以某种方式进行通信,不然这个文件很容易被损坏.文件锁可以解决这个问题,它可以控制对文件或文件中某个范围的字节的访问. 假设你的应用程序将用户的偏好存储在一个配置文件中,当用户调用这个应用的两个实例时,这两个实例就有可能会同时希望写这个配置文件.在这种情况下,第一个实例应该锁定这个文件,当第二个实例发现这个文件被锁定时,它必须决策是等待直至这个文件解锁,还是直接跳过这个写操作过程. 要锁定一个文件,可

PHP 写文件加锁的例子

用 PHP 的 file_put_contents 函数以追加的方式,循环 10 w 次写文件,耗时很多.因为 file_put_contents 函数每次都要打开文件,写入文件,然后关闭文件. 以下是测试: public function handle() {     $testTxt = storage_path('test.txt');     for ($i = 0; $i < 100000; $i++) {         $this->comment('writing...');

php计算指定目录下文件占用空间的方法

 这篇文章主要介绍了php计算指定目录下文件占用空间的方法,实例分析了php操作目录及文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php计算指定目录下文件占用空间的方法.分享给大家供大家参考.具体分析如下: php中可以通过 RecursiveDirectoryIterator 扩展 DirectoryIterator的getChildren() 方法提供访问子目录中的每一个元素的方法,下面的代码通过遍历访问目录下的所有文件,获取他们暂用的空间. ? 1 2 3

PHP递归遍历指定目录的文件并统计文件数量的方法

 这篇文章主要介绍了PHP递归遍历指定目录的文件并统计文件数量的方法,涉及php文件及目录操作的技巧,非常具有实用价值,需要的朋友可以参考下     本文实例讲述了PHP递归遍历指定目录的文件并统计文件数量的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?php //递归函数实现遍历指定文件下的目录与文件数量 function total($di

修复DBF数据表文件的简单方法

数据   修复DBF数据表文件的简单方法 如果你的软件提示"不是DATABASE 数据库"等意思说明你的数据库已经受损,需要进行修理.本人在实践中,摸索出几种可行的办法,以供大家参考,如有不正确之处或者其他更好的方法,希望不吝赐教:       方法1.如果你有DELPHI的Database DeskTop,修复DBF文件是一件非常容易的事,只要打开损坏的数据库(用Database DeskTop是可以打开损坏的DBF数据表的),修正损坏的记录,一般是最后几条记录,不能修正的损坏记录也

用修改文件时间的方法来加密文件

谈到文件加密已经有很多方法了,但传统的文件型加密方法都存在一些不足.例如:让人头痛的密码技术.复杂的全文加/解 密算法.会产生垃圾文件的暗贴技术等等.这里我向大家介绍一种新的文件加密思路. 在Win 95/98中选定一个文件后单激鼠标右键可以查看文件的属性.其中会列出该文件的创建时间.修改时间和访问时间.这 些信息的设置一般都是由操作系统(也就是由Dos/Windows等等)自动完成的,不会让用户轻易修改.利用这一特性就可以实现 很隐蔽的加密技术. 加密原理 用特定的时间信息替换原来的文件时间信

文件上传方法

文件上传是很早以前的事了,最早那会常用的就是IPC连接,然后一个一个的COPY,自从动网upfile漏洞出来以后,各种脚本系统如PHP.JSP下的文件漏洞纷纷暴出,原理都是大同小异,没有过滤文件上传路径,导致可以抓包然后把空格20改成00,变成空字符NULL,系统是从右往左识别的,所以到空字符那就截断了,更简单的就是过滤文件上传类型不完整,改后缀就可以解决了,这些上传文件的漏洞,用万能上传工具就可以轻松搞定,不过漏洞文件名不同罢了. 还有一些另类的文件上传方法,是在系统做了比较好的防范下完成的,