PHP中利用文件锁实现日志写入和网站接口访问等常见场景下的并发控制

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 针对并发环境下网站、日志文件写入产生的脏数据、更新丢失等情况的解决思路之一

//---并发下日志写入方案
$fp = fopen('./log/test_log.txt', 'a+');
if (flock($fp, LOCK_EX)) {
     fwrite($fp, '1\n');
     flock($fp, LOCK_UN);
  }
fclose($fp);        

//---接口并发控制示例   这个只是测试案例,可以将锁的粒度按照一定维度或者标识往下切割到更细来提高性能
public function test()
  {
    $id = $_REQUEST['id'];

    $fp = fopen('./test_log.txt', 'r');
    
    //打开后给被访问的文件施加排他锁(阻塞模式) 用以阻塞执行代码期间 其它进程对这个文件的访问 让其它进程处于等待状态
    if (flock($fp, LOCK_EX)) { //如果需要非阻塞模式可以用 LOCK_EX | LOCK_NB
        //以下进行业务逻辑的处理
        $list = M("test")->where("id={$id}")->find();
        
        if ($list && $list['status'] < 1) {
                $add_data['test_id'] = $id;
                $add_data['time'] = $_SERVER['REQUEST_TIME'];
                $add_rus = M("test_log")->add($add_data);
                if ($add_rus) {
                    $save_data['id'] = $id;
                    $save_data['status'] = 1;
                    $up_rus = M('test')->save($save_data);
                }
        }
        //以上进行业务逻辑的处理

        flock($fp, LOCK_UN);//记得解锁,PHP5.3.2以后的版本不再在调用fclose的时候自动解锁
    }

    fclose($fp);
}
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
16天前
|
监控 物联网 数据挖掘
php的应用场景
【8月更文挑战第4天】php的应用场景
46 5
|
6天前
|
存储 监控 Java
|
7天前
|
SQL 数据采集 JSON
使用对比!SLS 数据加工 SPL 与旧版 DSL 场景对照
本文讨论在不同的数据处理需求中,新版数据加工 SPL 与旧版数据加工 DSL 的使用对照。
|
17天前
分享一种接口的日志格式
分享一种接口的日志格式
35 13
|
20天前
|
存储 开发框架 前端开发
循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志
循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志
|
4天前
|
存储 Kubernetes Java
阿里泛日志设计与实践问题之在写多查少的降本场景下,通过SLS Scan方案降低成本,如何实现
阿里泛日志设计与实践问题之在写多查少的降本场景下,通过SLS Scan方案降低成本,如何实现
|
30天前
|
消息中间件 存储 Oracle
共识协议的技术变迁问题之能不能介绍下Share Log应用场景Pub/Sub
共识协议的技术变迁问题之能不能介绍下Share Log应用场景Pub/Sub
|
30天前
|
消息中间件 容灾
共识协议的技术变迁问题之Share Log在哪些场景中被广泛应用
共识协议的技术变迁问题之Share Log在哪些场景中被广泛应用
|
2月前
|
监控 Go
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
|
29天前
|
监控 存储
日志存储问题之志格式的乱象如何解决
日志存储问题之志格式的乱象如何解决