欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP文件处理之文件锁的疑问解答

程序员文章站 2022-03-11 13:28:15
...
在之前的文章《PHP中怎样删除一个目录(实例详解)》中详细的介绍了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);//读取文件内容
?>

输出结果:

PHP文件处理之文件锁的疑问解答

test.txt内被写入了数据:

PHP文件处理之文件锁的疑问解答

由上述示例我们便完成了对文件进行文件锁的操作,操作完成后使用fclose()函数来关闭文件;然后通过readfile()函数读取文件内容。其中需要注意的是:

当我们使用flock()函数,就是对文件进行了加锁,想要让文件自动解锁,只需要调用fclose()函数就可以了。在我们写代码的时候在使用文件锁之后还是加上解锁语句为好。

大家如果感兴趣的话,可以点击《PHP视频教程》进行更多关于PHP知识的学习。

以上就是PHP文件处理之文件锁的疑问解答的详细内容,更多请关注其它相关文章!