博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP使用flock实现文件加锁的方法
阅读量:5883 次
发布时间:2019-06-19

本文共 1370 字,大约阅读时间需要 4 分钟。

hot3.png

本文实例讲述了PHP使用flock实现文件加锁的方法。分享给大家供大家参考。具体分析如下:

flock在官方文档里的解释是:flock() 允许你执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是Windows)。如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),请将可选的第三个参数设置为 TRUE。锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用)。

简单来说,就是对一个文件进行锁定操作,使得多进程访问该文件时受到限制,从而防止冲突。举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
  
$file
=
fopen
(
"test.txt"
,
"w+"
);
  
if
(
flock
(
$file
,LOCK_EX))
  
{
   
fwrite(
$file
,
"Write something"
);
   
flock
(
$file
,LOCK_UN);
  
}
  
else
  
{
    
echo
"Error locking file!"
;
  
}
  
fclose(
$file
);
?>

说明:

1.这段代码的意思是,以读写方式打开文件test.txt,当一个用户调用该php页面时,即对test.txt文件进行操作,那么就会执行flock($file,LOCK_EX)代码,即将test.txt文件进行独占锁定(该文件只能由该用户进行读写操作),那么如果有其他新的用户想访问该文件,就会被阻塞,直到前者关闭文件(释放锁定)。

2.如果将代码改成flock($file,LOCK_EX+LOCK_NB)表示锁定时直接返回错误,那么如果有新的用户访问该文件,就会输出“Error locking file!”

3.该函数的语法是flock(file,lock,block),其中file必需。规定要锁定或释放的已打开的文件。lock 必需。规定要使用哪种锁定类型。block可选。若设置为 1 或 true,则当进行锁定时阻挡其他进程。

例如:请写一段PHP代码,确保多个进程同时写入同一个文件成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function
writeData(
$path
,
$mode
,
$data
)
{
  
$fp
=
fopen
(
$path
,
$mode
); 
  
$retries
= 0;
  
$max_retries
= 100; 
  
do
{
    
if
(
$retries
> 0) 
    
{
      
usleep(rand(1, 10000));
    
}
    
$retries
+= 1;
  
}
while
(!
flock
(
$fp
, LOCK_EX)
and
$retries
<=
$max_retries
); 
  
if
(
$retries
==
$max_retries
  
{
    
return
false;
  
}
  
fwrite(
$fp
,
"$data\n"
);
  
flock
(
$fp
, LOCK_UN);
  
fclose(
$fp
); 
  
return
true; 
}

转载于:https://my.oschina.net/wuzhencan/blog/604610

你可能感兴趣的文章
学习笔记之软考数据库系统工程师教程(第一版)
查看>>
PHP 程序员的技术成长规划
查看>>
memcached 分布式聚类算法
查看>>
jquery css3问卷答题卡翻页动画效果
查看>>
$digest already in progress 解决办法——续
查看>>
虚拟机 centos设置代理上网
查看>>
Struts2中Date日期转换的问题
查看>>
mysql 数据类型
查看>>
Ubuntu 设置当前用户sudo免密码
查看>>
设置tomcat远程debug
查看>>
android 电池(一):锂电池基本原理篇【转】
查看>>
Total Command 常用快捷键
查看>>
ionic 调用手机的打电话功能
查看>>
怎么使用阿里云直播服务应用到现在主流直播平台中
查看>>
1000 加密算法
查看>>
exif_imagetype() 函数在linux下的php中不存在
查看>>
Ruby的case语句
查看>>
Linux的链接文件-ln命令
查看>>
maven的tomcat插件如何进行debug调试
查看>>
table表头固定
查看>>