文件操作中的并发访问问题
请问怎样解决文件操作中的并发访问问题?如果有多个用户同时修改同一个文件中的数据,该怎么办?比如
$fh = fopen($ffile, "r")
$r = trim(fgets($fh, 10));
fclose($fh);
$r++;
$fh = fopen($ffile, "w");
fputs($fh, $r);
fclose($fh);
在以上代码中,进行以下操作时,比如fgets,fputs,同时又有其他用户操作该文件,怎么办?一个文件能同时被打开多次吗?
问题点数:50、回复次数:12Top
1 楼darzui(牛肉饭)回复于 2002-05-11 14:28:58 得分 0
这个问题没有价值吗?大家支持一下Top
2 楼xinxin1982(新新)回复于 2002-05-11 15:29:58 得分 0
可以被打开多次,但是写入的时候最好有个先后顺序
像mysql写入的时候可以有锁定的功能
最好在代码中也保护一下Top
3 楼wyx726(海风习习)回复于 2002-05-11 16:54:37 得分 0
fdsafsafTop
4 楼qsnake(开工)回复于 2002-05-11 17:53:53 得分 0
flock()Top
5 楼abin30(阿斌)回复于 2002-05-16 04:51:15 得分 15
给你两个函数作为例子,应该没有问题了
function readfromfile($file_name) {
$filenum=fopen($file_name,"r");
flock($filenum,LOCK_SH);
$file_data=fread($filenum,filesize($file_name));
fclose($filenum);
return $file_data;
}
function writetofile($file_name,$data,$method="w") {
$filenum=fopen($file_name,$method);
flock($filenum,LOCK_EX);
$file_data=fwrite($filenum,$data);
fclose($filenum);
return $file_data;
}
Top
6 楼darzui(牛肉饭)回复于 2002-05-16 11:39:17 得分 0
to: abin30(阿斌)
根据函数中flock第二个参数的不同,读文件的时候可以多个用户同时读,写文件的时候只能一个用户写。那么在这个用户写文件的时候,其他用户如果也有写文件的操作,会发生什么情况呢?我在单机上,没有实验过,请讲一讲好吗?Top
7 楼qsnake(开工)回复于 2002-05-16 15:04:50 得分 10
和用户没关系,根进程有关系吧?
如果文件被lock了,其他php程序会等候unlockTop
8 楼darzui(牛肉饭)回复于 2002-05-16 19:16:10 得分 0
to:qsnake(开工)
我 说的 “用户 ”和你说的 “进程 ”是同一个概念。可以理解为另一个 对该文件的请求。
是不是等候unlock之后,就可以正常操作了呢?比如一个文本计数器,计数文件被lock了,那么会不会因此减少计数?Top
9 楼GDXY(宣云)回复于 2002-05-29 14:32:43 得分 25
等候unlock后就可以正常操作,这就是阻塞的工作模式,如果不想阻塞模式,可以在flock的参数中指定LOCK_NB,那样的话其他用户不再等待而是放弃操作。Top
10 楼GDXY(宣云)回复于 2002-05-29 14:34:50 得分 0
通常情况下,其他用户等候unlock后就可以正常操作,这就是阻塞的工作模式,如果你不想这样,可以在flock函数中指定LOCK_NB参数,则其他用户不再等待而是放弃操作Top
11 楼darzui(牛肉饭)回复于 2002-05-29 14:43:53 得分 0
I see!!谢拉!Top
12 楼darzui(牛肉饭)回复于 2002-05-29 14:45:30 得分 0
I see!!谢啦!Top
13 楼abin30(阿斌)回复于 2002-06-02 16:34:58 得分 0
我再补充一点:
可以用一个文件是否存在作为是否有其他进程访问文件的标志。
每个进程在访问前,察看该文件是否存在。如果不存在
表示没人访问,建立该文件,。否则循环,等文件操作完成后再删除。
eg.
while(file_exists($lock_file))$p++;
flcose(fopen($lock_file,"w"));
$tmp=file($file);
unlink($lock_file);
这其中有个while 循环 可能在进程很多的时候加重负担,,
Top




