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

时间:2022-03-26 03:48:00

使用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

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

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

  1. 对tomcat来说,每一个进来的请求&lpar;request&rpar;都需要一个线程,直到该请求结束。

    这段时间折腾了哈java web应用的压力测试,部署容器是tomcat 7.期间学到了蛮多散碎的知识点,及时梳理总结,构建良好且易理解的知识架构把它们组织起来,以备忘.对web应用开发者来说,我们很关 ...

  2. 一个封装HTTP请求的函数&lpar;C&plus;&plus;&rpar;

    这里封装了HTTP请求的,支持GET与POST,并支持各种参数组合,调用方式很简单使用DEVWEB::WebRequest(string(“http://www.luaie.com/”),ret);就 ...

  3. 接口测试入门(2)--get和post初级请求&sol;使用httpclient做一个获取信息list的请求(需要登录才可以)

    抛去测试自动化的架构来,直接写单个测试用例的思路如下: 1.获取测试case的接口,对每一个接口的请求方式(get/post/delete/put)进行分析,是否需要参数(不同的用例设置不同的参数,如 ...

  4. springMVC一个Controller处理所有用户请求的并发问题(转)

    springMVC一个Controller处理所有用户请求的并发问题 有状态和无状态的对象基本概念: 有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的.一 ...

  5. jsp页面:一个form&comma;不同请求提交form

    需求:一个表单中有一个请求 action="url"发送数据地址: 在表单外有一个请求,请求form表单提交的数据 我们用js来写:通过每次请求传不同的action=url; 例如 ...

  6. 怎样使用ListView实现一个带有网络请求,解析,分页,缓存的公共的List页面来大大的提高工作效率

    在寻常的开发中常常会有非常多列表页面.每做一个列表页就须要创建这个布局文件那个Adapter适配器文件等等一大堆与之相关的附属的不必要的冗余文件. 假设版本号更新迭代比較频繁,如此以往,就会使项目pr ...

  7. Asp&period;Net MVC是否针对每次请求都重新创建一个控制器实例

    一.Asp.Net MVC是否针对每次请求都重新创建一个控制器实例 默认情况下,答案是确定的. ControllerBuilder类 ControllerBuilder.Current用户获取默认的控 ...

  8. 一个跨域请求的XSS续

    之前讨论过,在解决post跨域请求时,采用iframe+本域代理页的形式,兼容性(当然是包括IE6啦)是最好的.上次提到,代理页面的作用是:执行本域下的回调函数.就是这个原因,给XSS带来了便利.详细 ...

  9. 利用生产者消费者模型和MQ模型写一个自己的日志系统-并发设计里一定会用到的手段

    一:前言 写这个程序主要是用来理解生产者消费者模型,以及通过这个Demo来理解Redis的单线程取原子任务是怎么实现的和巩固一下并发相关的知识:这个虽然是个Demo,但是只要稍加改下Appender部 ...

随机推荐

  1. PHP5&period;3&period;3&plus;Apache2&period;2&period;16&plus;MySQL5&period;1&period;49

    轻松配置PHP5.3.3+Apache2.2.16+MySQL5.1.49,下面是有详细的步骤说明.   第一步:下载安装的文件 1. MySQL:下载地址mysql-5.1.49-win32.msi ...

  2. sql 注入的防范(一)

    为了保证程序的健壮性,我们必须对用户输入的数据做有效性验证,防止用户恶意提交数据. 关于防止 sql 注入 我主要从三个方面入手: 1.确认为正整数的,强制转化为int,$id  =$_GET('id ...

  3. 【STL】重载运算符

    重载运算符 为什么要重载运算符: C++中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如结构体),也需要类似的运算操作.这时就必须在C++中重新定义这些运算符,赋予 ...

  4. C&plus;&plus; STL小知识

    五种迭代器: 在STL中,迭代器主要分为5类,分别是:输入迭代器.输出迭代器.前向迭代器.双向迭代器和随机访问迭代器. 输入迭代器 :只读,支持++.==.!=: 输出迭代器 :只写,支持++: 前向 ...

  5. 3&period; 表单输入框 在 IE 中 会有 &OpenCurlyDoubleQuote;X” 和 类似wifi图标的图标出现

    原因: IE 自动给 input加了伪类 ::ms-clear 和 ::ms-reveal 解决: input::ms-clear, input::ms-reveal { display: none; ...

  6. LINUX 笔记-wc命令

    命令参数: -c 统计字节数. -l 统计行数. -m 统计字符数.这个标志不能与 -c 标志一起使用. -w 统计字数.一个字被定义为由空白.跳格或换行字符分隔的字符串.

  7. Nodejs的运行原理-科普篇

    前言 Nodejs目前处境稍显尴尬,很多语言都已经拥有异步非阻塞的能力.阿里的思路是比较合适的,但是必须要注意,绝对不能让node做太多的业务逻辑,他只适合接收生成好的数据,然后或渲染后,或直接发送到 ...

  8. 基于MongoDb官方C&num;驱动封装MongoDbCsharpHelper类(CRUD类)

    近期工作中有使用到 MongoDb作为日志持久化对象,需要实现对MongoDb的增.删.改.查,但由于MongoDb的版本比较新,是2.4以上版本的,网上已有的一些MongoDb Helper类都是基 ...

  9. 手把手教你在Ubuntu上分别安装Nginx、PHP和Mysql

    手把手教你在Ubuntu上分别安装Nginx.PHP和Mysql

  10. Gradle中的闭包

    Gradle是基于Groovy的DSL基础上的构建工具,Gradle中的闭包,其原型上实际上即Groovy中闭包.而在表现形式上,其实,Gradle更多的是以约定和基于约定基础上的配置去展现.但本质上 ...