PHP运用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:

  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 使用 OENVISION (|) 运算符进行的咬合。

    FILE_USE_INCLUDE_PATH : 在
include 目录里找找 filename。 越多音信可参见 include_path。
    FILE_应用软件END : 如若文件 filename
已经存在,追加数据而不是覆盖。
    LOCK_EX :
在写入时获得1个独占锁。

  context – 一个 context 资源。

再次来到值:该函数将回来写入到文件内数据的字节数,战败时再次回到FALSE

 

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

 

相关文章