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 方法来执行需要加锁的操作。

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

在 ThinkPHP 6 控制器中使用文件锁机制的更多相关文章

  1. ThinkPHP如何在控制器中调用命令

    前段时间因为业务需求,使用TP的command开发了几个模块,期间测试一下在控制器中调用命令的方式,发现一些问题记录一下 官方文档: <?php namespace app\index\cont ...

  2. selected 刷新页面后selected选中的值保持不表(thinkphp 从控制器assign 传值到js)

    昨晚解决select 刷新页面以后选择的值保持不变,要想让seleted不变,有两种思路, 1,在提交表单的时候,将所选择的option的属性设为checked . 2.将option的value或者 ...

  3. java jvm学习笔记十二(访问控制器的栈校验机制)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...

  4. 细说Lucene源码(一):索引文件锁机制

    大家都知道,在多线程或多进程的环境中,对统一资源的访问需要特别小心,特别是在写资源时,如果不加锁,将会导致很多严重的后果,Lucene的索引也是如此,lucene对索引的读写分为IndexReader ...

  5. THINKPHP之控制器

    如何新增控制器? 在Lib/Action中新增一个控制器:ProductAction.class.php: <?php class ProductAction extends Action{   ...

  6. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  7. linux中的tasklet机制【转】

    转自:http://blog.csdn.net/yasin_lee/article/details/12999099 转自: http://www.kerneltravel.net/?p=143 中断 ...

  8. Linux 2.6 中的文件锁

    简介: 本文的目的是想帮助读者理清 Linux 2.6中文件锁的概念以及 Linux 2.6 都提供了何种数据结构以及关键的系统调用来实现文件锁,从而可以帮助读者更好地使用文件锁来解决多个进程读取同一 ...

  9. OC:浅析Runtime中消息转发机制

    一.介绍 OC是一门动态性语言,其实现的本质是利用runtime机制.在runtime中,对象调用方法,其实就是给对象发送一个消息,也即objc_msgSend().在这个消息发送的过程中,系统会进行 ...

  10. 分段控制器UISegmentedControl的使用、同一个控制器中实现多个View的切换、addChildViewController等方法的使用

    本文先讲解简单的分段控制器UISegmentedControl的使用,然后具体讲解它最常使用的场景:同一个控制器中实现多个View的切换. 文章构思: 1.先直接讲解一张UI效果图的四种实现方式. 2 ...

随机推荐

  1. Solution Set - “让季节停止哽咽”

    目录 0.「CTT 2017」「洛谷 P4004」Hello world! 1.「CTT 2017」「洛谷 P4006」小 Y 和二叉树 2.「CTT 2017」「洛谷 P4226」避难所 3.「AG ...

  2. 谈谈flutter的线程

    本文同步发布于公众号:移动开发那些事谈谈flutter的线程 刚接触flutter的同学肯定会对fluter所谓的单线程架构很蒙逼,因为这与我们学开发时,各种语言里的多线程的介绍有点出入,而且手机的C ...

  3. 从Linux零拷贝深入了解I/O

    转载&学习文章:从Linux零拷贝深入了解I/O 本文将从文件传输场景以及零拷贝技术深究 Linux I/O 的发展过程.优化手段以及实际应用. 前言 存储器是计算机的核心部件之一,在完全理想 ...

  4. 小米CR6606,CR6608,CR6609 启用SSH和刷入OpenWRT 23.05.5

    上个月极低的价格得到一台CR6606和一台CR6609, 一直没时间研究, 终于趁春节假期把这两个都刷成 OpenWRT 配置说明 CPU: MT7621AT,双核880MHz 内存: NT5CC12 ...

  5. 解决使用PowerShell执行命令出现“因为在此系统上禁止运行脚本”的问题

    1.问题描述 出现的具体错误如下所示: 2.解决办法 以管理员身份运行PowerShell,执行命令get-executionpolicy可查看PowerShell执行的策略(Restricted代表 ...

  6. 解读 DeepSeek-R1 论文 - 通俗易懂版

    引言:让 AI 学会"思考"的新突破 在近年来的人工智能浪潮中,大型语言模型(LLM)如 ChatGPT 已经能回答各种问题,但它们在复杂推理方面仍有不足.所谓复杂推理,比如解决奥 ...

  7. Mac安装Prometheus + Grafana

    一.安装Prometheus 1.下载安装 brew install prometheus 2.安装路径 /opt/homebrew/Cellar/prometheus/3.1.0 3.修改配置文件 ...

  8. 常用Maven命令

    一.常用命令 1.1 打包 mvn clean package -DskipTests 指定环境 mvn clean install -Dmaven.test.skip=true -Pprod-tx ...

  9. mybatis之生命周期及作用域

    SqlSessionFactoryBuilder 一旦创建了SqlSessionFactory之后就没有作用了 局部变量 SqlSessionFactory 可以理解为数据库的连接池 SqlSessi ...

  10. 多节点oceanbase 集群部署

    安装前准备 硬件要求 CPU最少2核 磁盘最少19G 文件系统EXT4 戓 XFS 关闭透明大页 echo never > /sys/kernel/mm/redhat_transparent_h ...