开发者社区 问答 正文

请教各位PHP 读文件如何实现加锁?

有大量文件需要处理。
用一个php进程去操作会很慢。

如何在一个进程读某一个文件的时候,把文件锁上。
不让其他进程可以再读而直接跳过,继续读其他的?

把正在读得文件rename,读完之后再rename回来,效率挺低的。如果实在没有更好的方法,就只能用这个了。flock,测试了一下,貌似不太好用,试了一下,没实现文件的非阻塞读锁。
给不同进程分配不同的文件,不好实现。
也没数据库。就算有。用数据库做锁,貌似比rename更低效。

请问有什么更好的方式可以给文件加 读锁。因为,只需要读文件。

展开
收起
落地花开啦 2016-06-13 14:32:24 2931 分享 版权
2 条回答
写回答
取消 提交回答
  • PHP里面文件 非阻塞模式 排它锁:

    $fp = fopen($file_name, 'w+');
    if (!$fp) exit('文件打开失败!');
    if (flock($fp, LOCK_EX | LOCK_NB)) {
      //------执行业务流程
    
      //------执行业务流程
    
      flock($fp, LOCK_UN);
    } else {
      echo '加锁失败,请稍后重试!';
    }
    fclose($fp);
    
    
    
    2020-05-09 17:30:42
    赞同 1 展开评论
  • 喜欢技术,喜欢努力的人

    用memcached实现吧。

    比如读取文件 $filename = "t.txt";

    if(!$memcached->get($filename)){
       //文件锁不存在,那么执行文件读取功能
       //首先再将文件锁住,
       $memcaced->save($filename,'1');
       $fs = fopen($filename,'r+');
       
       fclose($fs);
       //读取完毕释放文件锁
       $memcaced->delete($filename);
    }else{
       // 文件锁已经存在,跳过
       
    }

    以上是 memcaced 纯内存操作,速度会很快,根本不要考虑到性能的问题,当然还有一种方法,采用真正的文件锁,即添加一个新文件的方法控制,文件争用,但是此方法将加大IO的开销。

    2019-07-17 19:35:55
    赞同 展开评论
问答分类:
问答标签:
问答地址: