在 ThinkPHP 6 控制器中使用文件锁机制
- 创建锁管理类
首先,创建一个锁管理类来处理文件锁:
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);
}
}
}
- 在控制器中使用锁
在你的控制器中,调用 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 控制器中使用文件锁机制的更多相关文章
- ThinkPHP如何在控制器中调用命令
前段时间因为业务需求,使用TP的command开发了几个模块,期间测试一下在控制器中调用命令的方式,发现一些问题记录一下 官方文档: <?php namespace app\index\cont ...
- selected 刷新页面后selected选中的值保持不表(thinkphp 从控制器assign 传值到js)
昨晚解决select 刷新页面以后选择的值保持不变,要想让seleted不变,有两种思路, 1,在提交表单的时候,将所选择的option的属性设为checked . 2.将option的value或者 ...
- java jvm学习笔记十二(访问控制器的栈校验机制)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...
- 细说Lucene源码(一):索引文件锁机制
大家都知道,在多线程或多进程的环境中,对统一资源的访问需要特别小心,特别是在写资源时,如果不加锁,将会导致很多严重的后果,Lucene的索引也是如此,lucene对索引的读写分为IndexReader ...
- THINKPHP之控制器
如何新增控制器? 在Lib/Action中新增一个控制器:ProductAction.class.php: <?php class ProductAction extends Action{ ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- linux中的tasklet机制【转】
转自:http://blog.csdn.net/yasin_lee/article/details/12999099 转自: http://www.kerneltravel.net/?p=143 中断 ...
- Linux 2.6 中的文件锁
简介: 本文的目的是想帮助读者理清 Linux 2.6中文件锁的概念以及 Linux 2.6 都提供了何种数据结构以及关键的系统调用来实现文件锁,从而可以帮助读者更好地使用文件锁来解决多个进程读取同一 ...
- OC:浅析Runtime中消息转发机制
一.介绍 OC是一门动态性语言,其实现的本质是利用runtime机制.在runtime中,对象调用方法,其实就是给对象发送一个消息,也即objc_msgSend().在这个消息发送的过程中,系统会进行 ...
- 分段控制器UISegmentedControl的使用、同一个控制器中实现多个View的切换、addChildViewController等方法的使用
本文先讲解简单的分段控制器UISegmentedControl的使用,然后具体讲解它最常使用的场景:同一个控制器中实现多个View的切换. 文章构思: 1.先直接讲解一张UI效果图的四种实现方式. 2 ...
随机推荐
- 轻松玩转 JMeter 测试计划组件
轻松玩转 JMeter 测试计划组件 宝子们,今天咱就来唠唠 JMeter 里那个超重要的测试计划组件,它可是整个性能测试的 "指挥官",把各种测试元素安排得明明白白. 一.测试计 ...
- Python绘制土地利用和土地覆盖类型图详解
土地利用和土地覆盖是环境科学和城市规划中的重要概念,它们能够帮助本文理解人与自然的关系,促进可持续发展.随着城市化进程的加快,科学地监测和管理土地资源显得尤为重要.Python作为一种强大的编程语言, ...
- torque提交作业
PBS(Protable Batch System)是功能最为齐全,历史最悠久,支持最广泛的本地集群调度器之一. PBS的目前包括openPBS,PBS Pro和Torque三个主要分支.其中Open ...
- 第八章 AtomicInteger源码解析
1.原子类 可以实现一些原子操作 基于CAS 下面就以AtomicInteger为例. 2.AtomicInteger 在没有AtomicInteger之前,对于一个Integer的线程安全操作,是需 ...
- 项目PMP之七项目成本管理
项目PMP之七--项目成本管理 一.定义:在预算内管理成本:预测项目成本 核心理念:重点关注项目活动的成本:同时决策的影响.相关方的不同时间不同方法的测算 趋势:挣值进度(ES)逻辑:敏捷的方式则 ...
- mxGraph绘制机构图
简单介绍一下使用的依赖: JGraphX package JGraphX is a Java Swing diagramming (graph visualisation) library lic ...
- 正式发布!《ICPMM行业云平台运营管理能力成熟度》系列标准来了!
近日,由中国信息通信研究院(简称中国信通院)主办的企业上云用云专项行动会在北京举行.在"行业云平台研讨会暨年度成果发布会"专题会议中,中国信通院携手天翼云与业界多家头部机构发布&l ...
- 闲话 6.19/CF1938M
CF1938M 计数以下序列 \(\lang a\rang\) 的个数: \[\sum_{i=1}^m a_i=n\\ \forall 1<i<m,(a_i-a_{i-1})(a_i-a_ ...
- 表治理-Iceberg小文件合并测试
总结 指标 合并前 合并后(因测试中多次合并,数据会偏多) 查询速度 246秒 13秒 表总大小 9.2G 26.4G 单个文件大小 1-25MB 60MB左右 metadata目录文件数 37 75 ...
- postman获取时间戳并自动计算token
工作中时常要测试接口,公共请求参数包括id, timestamp, token, token = MD5(id + key + timestamp)并转大写. 每次用外部工具去获取时间戳并计算toke ...