做了个弱统计,写入到文件中,引起并发问题,加锁解决

开始是使用file_get_contents,和file_put_contents()读取和写入文件,结果当同一时间大量请求时,文件内容就会出现重置为空的现象,导致原始内容丢失

网上找了个解决办法,经修改如下:

function pageCount($fileName){
    if ($fp = fopen($fileName, ‘r+‘)) {
        $startTime = microtime();
        do {
            $canWrite = flock($fp, LOCK_EX | LOCK_NB);
            if (!$canWrite) {
                usleep(round(rand(0, 100) * 1000));
            }
        } while ((!$canWrite) && ((microtime() - $startTime) < 1000));
        if ($canWrite) {
            $count = intval(fgets($fp));
            ++$count;
            ftruncate($fp,0); // 将文件截断到给定的长度
            rewind($fp); // 倒回文件指针的位置
            fwrite($fp, $count);
            flock($fp , LOCK_UN);
        }
        fclose($fp);
    }
}
时间: 2024-08-05 18:37:44

做了个弱统计,写入到文件中,引起并发问题,加锁解决的相关文章

Jsoup学习笔记9:Jsoup 解析saz文件,读取其中的htm文件到字符串,提取字符串中的数据写入csv文件中

本篇笔记将上篇笔记的操作做些改进,不再把saz文件中的htm文件解析出来,而是不解压直接读取其中的数据成字符串,基本思路如下: 1.自定义一个从文本文件读取内容到字符串的类:解析saz文件中的htm文档,将文件的内容读取到字符串中 2.自定义利用Jsoup解析htm字符串的类:利用Jsoup解析传入的htm字符串,将解析结果写入csv文件中 3.解析时,指定好文件路径,直接调用上面的两个工具类即可 示例代码如下: package com.daxiang.saztest; /** * 自定义一个从

awk命令之 - 统计/etc/passwd文件中各用户所使用的shell类型及出现次数

统计/etc/passwd文件中各用户所使用的shell类型及出现次数 awk -F: 'BEGIN{printf"%-15s\t%s\n","ShellType","Count"}{shellType[$NF]++}END{for(i in shellType)printf"%-15s\t%d\n",i,shellType[i]}' /etc/passwd

将对象以json格式写入到文件中

将 list 对象以json格式写入到文件中 try { ObjectMapper mapper = new ObjectMapper(); String value = mapper.writeValueAsString(list); OutputStream out =new FileOutputStream("D:/file/oms.json"); byte[] b=value.getBytes(); for(int i=0;i<b.length;i++){ out.wri

c#用log4Net将日志写入到Oracle数据库,并写入到文件中

原文:c#用log4Net将日志写入到Oracle数据库,并写入到文件中 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_37913923/article/details/79072898 1.从官网下载log4net包,安装到项目中: 2.配置文件log4net.config/app.config <?xml version="1.0" encoding=&

【python小练】0017-将xls文件内容写入xml文件中

第 0017 题: 将 第 0014 题中的 student.xls 文件中的内容写到 student.xml 文件中,如 下所示: <?xml version="1.0" encoding="UTF-8"?> <root> <students> <!-- 学生信息表 "id" : [名字, 数学, 语文, 英文] --> { "1" : ["张三", 150

JavaIO 将数据写入到文件中去

package com.Practice_FileWriter; import java.io.FileWriter; import java.io.IOException; public class JustPractice { public static void main(String[] args) throws IOException { //第一步,先建立一个可以向文件中写入数据的输出流对象,这一步的时候要给出写入文件的路径: FileWriter fw = new FileWrit

java将独到的指定文件截取并写入到文件中

将保存的某些文件选取其中想类似的部门使用String类中的方法将其截取并写入到指定文件中 public class Te3 { void read(String src,String start,String end) throws Exception{ FileInputStream a = new FileInputStream(src); byte[] b = new byte[1500]; StringBuffer s_1 = new StringBuffer(); int len =

结合zabbix统计/proc/meminfo文件中的内容

vim memory_status.sh #!/bin/bash #脚本解释器说明 MemTotal(){ awk '/^MemTotal/{print $2}' /proc/meminfo #打印/proc/meminfo文件中以MemTotal开头行的以空格分割的第二列元素的值,单位为kb } $1 #第一个位置参数,位置参数的值为相应函数名,则会调用相应函数 :wq! chmod +x memory_status.sh 执行命令: ./memory_status.sh MemTotal 

不在JPA 的 persistence.xml 文件中配置Entity class的解决办法

在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,2种方法可以解决此问题: 这2种方式都可以实现不用在persistence.xml文件中配置每一个实体类,从而免去每个Entity都要在persistence.xml文件中配置的烦恼,但是这种方式Entity实体类的主键字段注解@ID要放到 getXXX()方法上,否则不认. 方式1: 修改“LocalContainerEntityManagerFactoryBea