文件锁是一种机制,用于控制对文件的访问,以防止多个进程同时修改同一个文件而导致的数据不一致等问题。在 PHP 中,我们可以使用 flock 函数来实现文件锁。
1、定义一个文件夹路径,用于存放锁文件。
$dir = '/tmp/mylock';
2、判断文件夹是否存在,如果不存在,则创建。
is_dir($dir) or mkdir($dir, 0777, true);
3、打开一个文件,用于实现文件锁。‘w+’ 表示读写模式,如果文件不存在则创建。
$fp = fopen($dir . '/prolock.txt','w+');
4、使用 flock 函数获取文件锁,LOCK_EX 表示独占锁,即其他进程无法访问该文件。如果获取锁失败,则等待一段时间后再次尝试获取锁,直到成功为止。usleep 函数用于防止 PHP 占用 CPU,这里设置等待时间为 0.05 秒。
do{
$lockStatus = flock($fp,LOCK_EX);//获得锁
//为防止php占cpu不放
usleep(50000);//0.05s
}while(!$lockStatus);
5、如果获取锁成功,则可以操作资源。
//抢到锁的程序可以操作资源
if($lockStatus){
//TODO
flock($fp,LOCK_UN);//释放锁
}
最后,关闭文件指针。
fclose($fp);//关闭指向的文件
下面是一个实现文件锁的完整 PHP 代码:
$dir = '/tmp/mylock';
is_dir($dir) or mkdir($dir, 0777, true);
$fp = fopen($dir . '/prolock.txt','w+');
do{
$lockStatus = flock($fp,LOCK_EX);//获得锁
//为防止php占cpu不放
usleep(50000);//0.05s
}while(!$lockStatus);
//抢到锁的程序可以操作资源
if($lockStatus){
//TODO
flock($fp,LOCK_UN);//释放锁
}
fclose($fp);//关闭指向的文件