CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  PHP

文件操作中的并发访问问题

楼主darzui(牛肉饭)2002-05-11 13:46:32 在 Web 开发 / PHP 提问

请问怎样解决文件操作中的并发访问问题?如果有多个用户同时修改同一个文件中的数据,该怎么办?比如  
   
  $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

相关问题

  • 有关日志文件的并发访问问题
  • 怎样在Windows里访问和操作Linux的文件呀?
  • 访问文件
  • 文件访问
  • 请问怎样在Windows里访问和操作Linux的文件呀?
  • 当采用ado时,是不是ado自动管理了数据库文件的并发操作?
  • 求助。。。怎样保证并发的多线程不要同时操作同一个文件?
  • 文件操作!
  • 文件操作
  • 文件操作?

关键词

  • 文件
  • 用户
  • 函数
  • 模式
  • 操作
  • filenum
  • 访问
  • flock
  • fh
  • lock

得分解答快速导航

  • 帖主:darzui
  • abin30
  • qsnake
  • GDXY

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo