开发者社区> 问答> 正文

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

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

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

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

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

展开
收起
落地花开啦 2016-06-13 14:32:24 2822 0
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
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
阿里云栖开发者沙龙PHP技术专场-深入浅出网络编程与swoole内核-吴镇宇 立即下载
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载