zoukankan      html  css  js  c++  java
  • 使用PHP文件锁写一个多个请求同时并发写入一个文件,要求不脏读、数据不丢失

    使用PHP文件锁写一个多个请求同时并发写入一个文件,要求不脏读、数据不丢失.

    //并发文件操作
    function filehandle($filename,$data){
        $start = 0;
        $end = 3000;
    
        if(!file_exists($filename)){
            return "文件不存在";
        }
    
        if(!is_string($data)){
            return "写入内容只能为字符串类型";
        }
    
        if($fp = fopen($filename,'a')){
            do{
                //获取文件独占锁
                $canWrite = flock($fp,LOCK_EX);
    
                if(!$canWrite){
                    $rand = mt_rand(1,100);
                    //让程序休眠随机毫秒数再试
                    usleep($rand*1000);
                    $start += $rand;
                }
    
            }while(!$canWrite && $start < $end);
    
            if(!$canWrite){
                //未能获得锁
                return "获取文件锁失败";
            }else{
                fwrite($fp,$data);
            }
    
            //释放锁定,关闭文件
            flock($fp, LOCK_UN);
            fclose($fp);
            return true;
    
        }else{
            return "打开文件失败";
        }
        
    }

    此方法的要点是当用户操作文件的时候必须获取文件的独占锁,若文件已经被锁定,则让程序休眠若干毫秒后重试,知道获得锁或者超时为止。

    flock():轻便的咨询文件锁定

    函数参数说明:

    handle - 文件系统指针,是典型地由 fopen() 创建的 resource(资源)。

    operation - 可以是以下值之一:

    1. LOCK_SH 取得共享锁定(读取的程序)。
    2. LOCK_EX   取得独占锁定(写入的程序。
    3. LOCK_UN 释放锁定(无论共享或独占)。

    返回值:成功时返回 TRUE, 或者在失败时返回 FALSE

    方案二:

    file_put_contents($filename, $data, FILE_APPEND|LOCK_EX);

    int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] );

    函数说明:将一个字符串写入文件

    参数说明:

      filename - 要被写入数据的文件名。

      data - 要写入的数据。类型可以是 string,array(一维) 或者是 stream 资源。

      flags - flags的值可以是 以下 flag 使用 OR (|) 运算符进行的组合。

        FILE_USE_INCLUDE_PATH : 在 include 目录里搜索 filename。 更多信息可参见 include_path。
        FILE_APPEND : 如果文件 filename 已经存在,追加数据而不是覆盖。
        LOCK_EX : 在写入时获得一个独占锁。

      context - 一个 context 资源。

    返回值:该函数将返回写入到文件内数据的字节数,失败时返回FALSE

    (注:以上方案均未经过实际项目测试)

  • 相关阅读:
    中位数
    two-strings-are-anagrams&&compare-strings&&longest-words
    第三次作业-------结对编程
    Git的基本使用方法和安装&心得体会(使用git命令行)
    第二次作业-----------结对项目之需求分析与原型设计
    使用Git进行代码管理心得------------个人练习
    Android开发环境的发展演变
    软件工程的实践项目的自我目标
    QT实现2048
    poj3723 Conscription
  • 原文地址:https://www.cnblogs.com/praglody/p/6729342.html
Copyright © 2011-2022 走看看