在之前的文章《PHP中怎样删除一个目录(实例详解)》中详细的介绍了PHP中删除目录的相关知识,其中删除一个非空的目录稍微复杂些。本篇文章我们来看一下PHP中文件锁的相关知识,希望对大家有帮助!
在之前的文章中我们已经了解了很多的文件处理相关知识,比如写入文件、读取文件等等操作,其中有一个东西叫做文件锁。关于文件锁的理解可能会有些抽象,因为文件锁的机制一般在打开文件的时候是看不到效果的。
那文件锁到底是什么东西?他是用来做什么的?我们为什么要使用文件锁?我们要怎样去使用它?带着这些疑问下面就让我们来看一下文件锁的相关知识吧。
什么是文件锁?
首先的一个问题,简单来说,文件锁就是一种文件保护机制,可以理解为当你在读取或者写入这个文件的时候,也就是已经有一位在进行对该文件进行操作的时候,文件的一种保护机制,为例避免在文件被操作期间被另一个进行操作。
文件锁的用途
一个文件有文件锁的话,当我在使用这个文件的时候,只有我能够对该文件进行操作,除非将这个文件锁进行释放,否则别人就没法插手我对该文件的操作。同一时段只能够允许一人进行操作,防止数据错误。
若是没有文件锁,出现多个人员操作同一个文件,极有可能会造成数据的错误或者不对等,因此使用文件锁是必要的。这就是文件所得用途以及为什么要使用文件锁。
怎样去使用文件锁:flock()
函数
接下来我们看一下怎样去使用这个PHP文件锁,首先我们需要知道,我们在打开文件后可以通过flock()函数来对文件进行上锁。
flock()
函数的基本语法格式如下:
flock(resource $handle, int $operation[, int &$wouldblock])
其中需要注意的是:
参数$handle
表示的是文件系统的指针,也就是通过fopen()
创建的文件资源;参数$operation
表示的是文件锁类型;参数$wouldblock
是一个可选参数,他表示的是可以将其设置为1
或者true
,这样的话文件锁定时就会堵塞其它进程。
下面我们来介绍一下参数$operation的类型:
-
LOCK_EX
表示的是写锁,也就是在写入的时候是写锁状态,其他人不能写也没法读,只有等解锁后才能恢复。 -
LOCK_SH
表示的是共享锁,理解为别人只能读,但是没法写。解锁后回复。 -
LOCK_UN
表示的是解除上面两种状态。也就是解锁。 -
LOCK_NB
表示的是在读取或写入的时后,当文件锁住了,就会马上返回通知访问的文件被锁了。
接下来我们通过示例来看一下,示例如下:
<?php header("Content-Type: text/html;charset=utf-8"); //设置字符编码 $file = "test.txt"; $handle = fopen($file,'w+'); //打开文件 if(flock($handle, LOCK_EX|LOCK_NB)){ //给文件上锁 fwrite($handle, '被锁住了'); //写入数据 flock($handle, LOCK_UN); //释放文件锁 }else{ echo "锁失败了"; } fclose($handle);//关闭文件 readfile($file);//读取文件内容 ?>
输出结果:
test.txt内被写入了数据:
由上述示例我们便完成了对文件进行文件锁的操作,操作完成后使用fclose()函数来关闭文件;然后通过readfile()函数读取文件内容。其中需要注意的是:
当我们使用flock()函数,就是对文件进行了加锁,想要让文件自动解锁,只需要调用fclose()函数就可以了。在我们写代码的时候在使用文件锁之后还是加上解锁语句为好。
大家如果感兴趣的话,可以点击《PHP视频教程》进行