[PHP]flock文件IO锁的使用

一、flock概述

bool flock  ( resource $handle  , int $operation  [, int &$wouldblock  ] )

参数


handle
文件的指针,由 fopen()  创建的 resource (资源);
operation
operation 可以是以下其中一个值:
1. LOCK_SH  取得共享锁,该锁只能用于读取文件
2. LOCK_EX  取得排他锁,该锁可以读写文件
3. LOCK_UN  解除锁定(无论是共享还是排他)


wouldblock
这是一个引用类型,上锁后如果其他进程访问此资源会阻塞,此变量将会设为true,注意:windows不支持此功能;

二,锁类型的差异

一切关于计算机对资源访问的锁定,都是基于进程而言的,进程给资源上锁的行为,可以抽象的理解为进程试图获得对该资源的操作权限,一旦获取操作权限,其他进程想要同时操作该资源时,必须等待该进程操作完成释放操作权限,其他进程才能对此资源进行操作,此概念可以防止资源争用冲突导致的各种不可预知的行为;

一般而言,资源锁只分为两种,共享锁和排他锁,也通俗地被称为读锁和写锁,再通过这两种锁型,衍生出各种概念性的锁定场景,在这里就不在讨论范围内了;

来看看两种锁定的概念;

 共享锁:当一个进程给某个资源加上共享锁,其他进程同一时间内,也可以把该资源加上自己的共享锁,但是如果某进程需要向该进程加上排他锁的时候就需要等待所有的共享锁释放之后的事了,这个其间进程被阻塞以等待所有共享锁释放;

 排他锁:当一个进程给某个资源加上了排他锁,其他进程需要再往这个资源添加锁定的时候(无论共享锁还是排他锁),都需要等待此排他锁释放后,这个其间进程被阻塞已等待该排他锁释放;

 

三、特性

flock是一种协议型锁定,它不是强制性的,也就是说,某种情况下,当一个进程没有按照约定在操作文件之前调用flock获取锁,它依然可以在没有获取锁的前提下操作文件,无论是读取或者是写入,所以flock并不可靠

上面说的某种情况下,究竟是哪种情况? wouldblock 参数被检测为0时,不过windows,并不支持这一检测,所以为了安全起见,最好遵守约定,在所有操作文件的前提时都相约先获取锁;

 

posted @ 2018-05-31 09:45  yiyide266  阅读(241)  评论(0编辑  收藏  举报