Black Left老师讲课了——文件锁定(PHP)

2019年5月7日

 

HERO


一、开场白

大家好,今天我们来讲一讲文件锁定。首先我先提出来,这个文件锁定有点像多线程的加锁操作,什么是多线程加锁操作呢,我们以后有机会再讲。今天我们的主题是文件的锁定,来吧,言归正传。我们可以设想一个这样的环境,我们用了文件操作开发了一个类似于电商平台买卖交易那样的系统,有的时候会有两个用于可能订购同一件商品,如果一个客户通过fopen函数打开了一个文件,同时另一个客户也通过fopen函数打开了相同的文件,那么两个人的操作到底结果会是什么呢?想象一下,他们是同时操作,是的,那你说到底结果会是什么?其实这个是说不准的,通常都是不预测的。最终的答案取决于操作系统是如何处理的。那么我们为了避免这样的情况,就可以用到我们的文件锁定这么一个行为操作了。文件锁定,你可以简单理解成它是为了避免文件同时被多人操作而导致出一些不确定结果。那么我们怎么用呢?其实也很简单,就是通过简单的函数——flock()就OK了。

二、flock函数介绍

我们先来看一下官方给出的语法结构:

其实看完这个函数的语法我们就大概能够明白了,(Reference)这个函数必须将一个指向被打开文件的指针和一个表示所需锁定类型的常数作为参数传递给这个函数,如果文件锁定成功,返回值为true,如果文件锁定失败,返回值为false。如果获得文件所将导致当前的进程被阻塞可选的第三个参数将被设置为TRUE(End),第一个参数我们好理解,其实就是fopen打开的那个文件,那么第二个呢?第二个其实官方给了有一个可选的值,我们来看一看:

怎么理解呢,可以理解成如果是_SH,读操作锁定,意味着文件可以共享,其他人可以读该文件。如果是_EX,写操作锁定。这个文件是互斥的,该文件不能被共享。如果是_UN,释放被锁定过的文件。这里提个醒,flock函数无法在NFS或其他网络文件系统中使用。有人可能想问了,这个NFS是什么鬼东西?大概来说一下吧,(Reference)NFS是network filesystem的缩写,最早之前是由sun这家公司发展的。它的功能就是可以通过网络,让不同的机器、不同的操作系统可以彼此分享个别的档案。所以呢,你可以简单的把这个看成一个文件服务器,对于不理解的同学你可以简单的理解成那个远程的文件服务器好像自己的一个磁盘分区一样,使用的时候是相当的便利的。(End)还有其他的网络文件系统我就不一一的提出来了,大家可以自己下去研究一下。我们看了这么多的介绍,那么我们怎么用呢?我们可以看一看基本的一个代码:

 

这里再提示一下,flock还无法在其他更早不支持文件锁定的文件系统中使用,例如FAT。FAT又是什么呢,我来大概的解释一下。FAT是文件分配表,这是一种用来记录文件所在位置的表格,它是一种文件系统。而这个FAT就是不支持文件锁定。还有在某些操作系统中,因为它是在进程级别上实现的,所以如果你在多线程服务器API中使用,该函数也无法正确使用。

三、庆幸自己能解决多人操作的问题了

看似我们加锁后就问题解决了,其实不然,还会有新的问题。比如我们两个脚本同时申请对一个文件加锁,最终的结果是什么呢?我们不得而知,因为这就又涉及到两个进程竞争加锁,我们无法确定哪个进程成功,这就会导致更多的一些细节问题。所以如果是真的想要解决这样那样的各种问题,我们最好是使用数据库管理系统就可以解决上述的问题了。

 

 

本内容纯原创,转载请标明出处————————————作者:Black Left    日期:2019年5月7日23点09分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值