首页 > 编程语言 >在 ThinkPHP 6 控制器中使用文件锁机制

在 ThinkPHP 6 控制器中使用文件锁机制

时间:2024-08-10 15:05:22浏览次数:6  
标签:function 文件 控制器 加锁 LockManager lockFilePath ThinkPHP lockFile

  1. 创建锁管理类

首先,创建一个锁管理类来处理文件锁:

namespace app\common\service;

use Exception;

class LockManager
{
    private $lockFilePath;
    private $lockFile;

    public function __construct($lockFilePath)
    {
        $this->lockFilePath = $lockFilePath;
    }

    public function __destruct()
    {
        $this->releaseLock();
    }

    public function executeWithLock(callable $callback)
    {
        // 打开锁文件,文件不存在时会自动创建
        $this->lockFile = fopen($this->lockFilePath, 'w+');
        if (!$this->lockFile) {
            throw new Exception("无法打开锁文件");
        }

        try {
            // 尝试获取排他锁(独占锁)
            if (flock($this->lockFile, LOCK_EX)) {
                // 锁定成功后执行关键代码
                $callback();
            } else {
                throw new Exception("无法获取锁");
            }
        } finally {
            // 释放锁
            $this->releaseLock();
        }
    }

    private function releaseLock()
    {
        if ($this->lockFile) {
            flock($this->lockFile, LOCK_UN);
            fclose($this->lockFile);
        }
    }
}
  1. 在控制器中使用锁

在你的控制器中,调用 LockManager 来执行需要加锁的操作:

namespace app\controller;

use app\common\service\LockManager;
use think\Controller;
use think\Request;

class TaskController extends Controller
{
    public function process(Request $request)
    {
        // 定义锁文件的路径
        $lockFilePath = runtime_path() . 'lockfile';

        // 创建 LockManager 实例
        $lockManager = new LockManager($lockFilePath);

        // 执行需要加锁的操作
        try {
            $lockManager->executeWithLock(function() {
                // 执行关键操作
                echo "获取锁成功,执行关键操作\n";
                
                // 模拟长时间操作
                sleep(5);
                
                echo "操作完成,释放锁\n";
            });
        } catch (Exception $e) {
            // 处理异常
            echo "错误: " . $e->getMessage();
        }
    }
}

在服务层中使用锁

如果你希望在服务层中处理锁,可以将锁管理逻辑集成到服务类中,类似于控制器中的使用方式。然后在控制器中调用这个服务来处理业务逻辑。

总结

  • 将锁管理逻辑封装到服务类中。
  • 在需要加锁的地方(控制器、服务层等)创建 LockManager 实例并调用 executeWithLock 方法来执行需要加锁的操作。

这样,可以确保在执行关键操作时获得独占锁,并在操作完成后释放锁。

标签:function,文件,控制器,加锁,LockManager,lockFilePath,ThinkPHP,lockFile
From: https://www.cnblogs.com/zxingduo/p/18352295

相关文章

  • 智能车创意组地平线赛道--Yolov5数据集标注xml文件时统一标签问题
    废话不多说,直接给出代码。'''通过解析xml文件,批量修改xml文件里的标签名称,比如把标签zero改成num'''importos.pathimportglobimportxml.etree.ElementTreeasETpath=r'D:\test'#存储标签的路径,修改为自己的Annotations标签路径forxml_fileinglob.glob(pa......
  • 重要文件如何加密?文件加密软件哪个好?
    为了避免文件被盗、外泄,我们需要加密保护重要文件。加密文件最简单的方法就是使用专业的文件加密软件,而文件加密软件哪个好用呢?下面我们就来盘点一下。文件夹加密超级大师文件夹加密超级大师是一款优秀的电脑数据加密软件,支持文件加密功能,并提供了两种文件加密类型。软件界面......
  • GitLab 之 Git LFS 大文件存储的配置
    参考https://cloud.tencent.com/developer/article/1010589LFS介绍Git大文件存储(LargeFileStorage,简称LFS)目的是更好地把大型二进制文件,比如音频文件、数据集、图像和视频等集成到Git的工作流中。我们知道,Git存储二进制效率不高,因为它会压缩并存储二进制文件的所有完整......
  • 如何在 Windows 11/10/8/7 中恢复已删除和未保存的记事本文本文件
    很多原因都会导致未保存的记事本文本文件丢失。这些包括意外关闭、系统崩溃或电源故障等。无论丢失文本文件的原因是什么,相关的焦虑都是一样的。如果您遇到这种情况,可以使用以下有效方法在Windows11/10/8/7 中恢复已删除的文本文件。在这篇文章中,我们将分享三种在Windows......
  • 【编程笔记】解决移动硬盘无法访问文件或目录损坏且无法读取
    解决移动硬盘无法访问文件或目录损坏且无法读取只解决:移动硬盘无法访问文件或目录损坏且无法读取问题由于频繁下载数据,多次安装虚拟机导致磁盘无法被系统识别。磁盘本身是好的,只是不能被识别,如果将磁盘格式化,就可以正常使用,这样磁盘内数据就丢失了。怎样才能即保留数据......
  • Linux磁盘挂载windows文件夹
    一、mountmount命令用于加载文件系统到指定的加载点。此命令的最常用于挂载cdrom,使我们可以访问cdrom中的数据,因你将光盘插为入cdrom中,Linux并不会自动挂载,必须使用Linuxmount命令来手动完成挂载。语法mount(选项)(参数)选项-V:显示程序版本;-l:显示已加载的文件系统列表;-h:显......
  • WebDAV服务不能上传大文件,文件超过50M报错[0x800700DF]怎么办?
    这个问题需要分别从服务端和客户端解决。1.Windows客户端解除50M文件限制,Windows访问Webdav服务时,大于50M文件提示错误[错误:0x800700DF]部署了webdav,Windows10映射网络磁盘,传输文件超过大约50MB的文件会弹出“0x800700DF:文件大小超过允许的限制,无法保存”,或者报错:“无法读......
  • 【待做】ThinkPHP系统常被挂马的代码
    https://mp.weixin.qq.com/s/fn_v0ydNSJ7g2nhujv621gThinkPHP系统常被挂马的代码原创秋刀鱼儿啊php学习交流吧2024年07月31日22:58广东在使用ThinkPHP框架(无论是版本3、5还是6)进行开发时,也有一些常见的代码结构和实践,如果不当,可能会导致安全漏洞,从而容易被攻击者利用......
  • C# 常用文件类概述
    1.常用文件类概述文件、目录(文件夹)、路径输入及输出常用的类有: File,FileInfo,Directory, DirectoryInfo,Path,DriveInfo。(更多的请查看官方文档)1.文件相关类:File类,FileInfo类2.路径类:Path类3.盘符类:DriveInfo类File和FileInfo的区别:File类和FileInfo类都是提供用于......
  • linux command --- less more(分页输出文件内容)
    lessless命令用于显示文件或命令输出的内容,它一次只显示一个页面(分页显示工具)。它类似于more命令,但less具有更高级的功能,它允许您在文件中向前和向后导航。less命令主要用于打开大文件,less不会读取整个文件,相比于vim或nano等文本编辑器,加载时间会更快。less命令的语法格式......