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日志并进行多维度分析。
相关文章
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
3月前
|
监控 物联网 数据挖掘
php的应用场景
【8月更文挑战第4天】php的应用场景
83 5
|
1月前
|
运维 监控 物联网
PHP的应用的应用场景
【10月更文挑战第11天】PHP的应用的应用场景
8 1
|
2月前
|
Java PHP 数据安全/隐私保护
PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用
本文详细介绍了PHP面向对象编程的一系列核心概念和用法,包括构造函数、析构函数、继承、方法重写、访问控制、接口、抽象类、静态成员、final关键字、以及this、self、parent这三个关键字的异同和作用。通过具体示例代码,展示了如何在PHP中使用这些面向对象的特性,以及它们在实际开发中的应用。
PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
45 2
|
2月前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
3月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之AllLoggers接口获取异常日志的Logger实例的问题如何解决
Java应用结构规范问题之AllLoggers接口获取异常日志的Logger实例的问题如何解决
|
3月前
|
Ubuntu Linux 测试技术
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
|
3月前
|
应用服务中间件 Linux nginx
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
|
3月前
|
存储 监控 Java