PHP flock实现文件加锁

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

<?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代码,确保多个进程同时写入同一个文件成功

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, "$data\n");
	flock($fp, LOCK_UN);
	fclose($fp); 

	return true;
}

PHP flock实现文件加锁

时间: 2024-10-13 11:08:27

PHP flock实现文件加锁的相关文章

PHP使用flock实现文件加锁来防止多进程同时写入文件

lock在官方文档里的解释是:flock() 允许你执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是Windows).如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),请将可选的第三个参数设置为 TRUE.锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用). 简单来说,就是对一个文件进行锁定操作,使得多进程访问该文件时受到限制,从而防止冲突.举个例子: <?php    $file = fopen("test.txt&

php文件加锁 lock_sh ,lock_ex

文件锁有两种:共享锁和排他锁,也就是读锁(LOCK_SH)和写锁(LOCK_EX) 文件的锁一般这么使用: $fp = fopen("filename", "a"); flock($fp, LOCK_SH) or die("lock error") $str = fread($fp, 1024); flock($fp, LOCK_UN); fclose($fp); 注意fwrite之后,文件立即就被更新了,而不是等fwrite然后fclose之后

SVN ---文件加锁,执行clean up命令

一.SVN 中 clean up 的功能 当Subversion改变你的工作拷贝(或是.svn中的任何信息),它会尽可能的小心,在修改任何事情之前,它把意图写到日志文件中去,然后执行 log文件中的命令,并且执行过程中在工作拷贝的相关部分保存一个锁,防止Subversion客户端在变更过程中访问工作拷贝.如果 Subversion的操作中断了(举个例子:进程被杀死了,机器死掉了),日志文件会保存在硬盘上,通过重新执行日志文件,Subversion可以完成上一次开始的操作,你的工作拷贝可以回到一致

SVN与TortoiseSVN实战:文件加锁详解

硬广:<SVN与TortoiseSVN实战>系列已经写了八篇,本篇是完结篇,整个系列结合TortoiseSVN对SVN中容易被忽视的部分进行了详解,以技巧性为主. 本篇详解使用TortoiseSVN对文件进行加锁和解锁的技巧,其中涉及到了之前介绍的SVN属性知识,关于属性可以翻看<SVN与TortoiseSVN实战:属性的奇技淫巧(一)>.<SVN与TortoiseSVN实战:属性的奇技淫巧(二)>. 加锁与解锁的操作对于项目中的二进制文件,如图片.声音.动态库等不可合

SVN文件加锁

原文:SVN与TortoiseSVN实战:文件加锁详解 加锁与解锁的操作对于项目中的二进制文件,如图片.声音.动态库等不可合并文件是非常有用的,可以让这些文件防止产生恼人的冲突,但TortoiseSVN中的Get lock的其实并不能满足需要,并不能在编辑前获得对文件的独占访问,这也是本文要结合属性来详解文件加锁的原因. 本篇内容概要: 1.版本控制系统的加锁策略:乐观加锁.严格加锁: 2.使用TortoiseSVN获取锁和释放锁: 3.使用属性,将文件设置为只读: 4.关于锁的建议: 1.版本

Python中给文件加锁

首先要引入库import fcntl打开一个文件f = open('./test')对该文件加密:fcntl.flock(f, fcntl.LOCK_EX)这样就对文件test加锁了,如果有其他进程要对test进行加锁,则不能成功,会被阻塞,但不会退出程序.解锁:fcntl.flock(f,fcntl.LOCK_UN)解锁后,其他进程就可以对该文件进行加锁了.另外还有一种共享锁:acquire a shared lockfcntl.flock(f,fcntl.LOCK_SH) 还有一篇文章htt

使用系统调用fcntl()来对文件加锁

在文已经共享的情况下如何操作,也就是当多个进程同时操作同一个文件时,我们怎么保证文件数据的正确性.linux通常采用的方法是文件上锁,来避免共享资源的产生竞争状态. 文件锁包括建议性锁和强制性的锁.建议性的,顾名思义,相对温柔一些,在对文件进行锁操作时,会检测是否已经有锁存在,并且尊重已有的锁.在一般的情况下,内核和系统都不使用建议锁.强制性的锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他进程对其进行读写操作.采取强制性的锁对性能的影响很大,每次进行读写操作都必须检查是否

SVN中如何为文件夹中的所有文件加锁

经过一段时间的试用,发现不加锁的共享式开发还是不太方便.还是全部设置为独占式加锁,如有共享式修改需求再设置为不加锁比较好. 经过一番摸索,总结出如下的加锁方式是可行的: 注:第一步是必须的,必须完成第一步才能做后续操作,否则项目无法生成! 1.如果某些项目包含bin.obj等生成的文件夹,如下图右键选中相应菜单并提交(右键SVN Commit  ) 2.在所在的项目文件夹上右键,选菜单如下图: 3.在所在文件夹上右键提交修改. ―――――――――――――――――如何修改回原来的共享式开发――――

flock,lockf,flockfile,funlockfile

flock和lockf 从底层的实现来说,Linux的文件锁主要有两种:flock和lockf.需要额外对lockf说明的是,它只是fcntl系统调用的一个封装.从使用角度讲,lockf或fcntl实现了更细粒度文件锁,即:记录锁.我们可以使用lockf或fcntl对文件的部分字节上锁,而flock只能对整个文件加锁.这两种文件锁是从历史上不同的标准中起源的,flock来自BSD而lockf来自POSIX,所以lockf或fcntl实现的锁在类型上又叫做POSIX锁. 除了这个区别外,fcntl