libratechie / think-distributed-lock
一个专为 ThinkPHP 框架设计的轻量级分布式锁组件,帮助开发者轻松实现高并发场景下的资源互斥访问
v1.0.0
2025-02-05 09:10 UTC
Requires
- php: >=8.0.0
- topthink/framework: ^8.0
This package is auto-updated.
Last update: 2025-03-05 09:44:29 UTC
README
专为 ThinkPHP 框架设计的轻量级分布式锁组件,帮助开发者轻松实现高并发场景下的资源互斥访问。
特性
- 自动锁释放与防死锁机制
- 简单直观的 API 设计
- 完美适配 ThinkPHP 8.x
- 开箱即用的配置方案
安装
composer require libratechie/think-distributed-lock
配置
在 config/distributed_lock.php 中配置(文件不存在时会自动创建):
return [ // 默认使用的数据库连接配置 'default' => env('LOCK_DRIVER', 'redis'), 'connections' => [ 'redis' => [ // 驱动方式 'type' => 'redis', // 服务器地址 'host' => env('LOCK_REDIS_HOST', '127.0.0.1'), // 端口 'port' => env('LOCK_REDIS_PORT', 6379), // 锁前缀 'prefix' => env('LOCK_REDIS_PREFIX', 'lock_'), ], ] ];
使用指南
use DistributedLock\DisLockFactory; // 初始化锁 $dis_lock = DisLockFactory::getInstance(); public function orderCreate($buyer_id) { $lock_key = "user_submit_order:{$buyer_id}"; // 尝试获取锁(等待10秒) if (!$lock = $dis_lock->lock($lock_key, 10)) { return json(['error' => '操作过于频繁,请稍后重试']); } try { // 你的业务逻辑... // 例如:订单创建、库存扣减等 return json(['status' => 'success']); } catch (\Exception $e) { // 异常处理... return json(['error' => $e->getMessage()]); } finally { // 确保最终释放锁 $dis_lock->unlock($lock_key); } }
注意事项
-
异常处理
确保在 try-catch 块中进行业务操作,避免异常导致锁无法释放; -
不可重入锁
本项目当前不支持可重入锁机制。即同一线程在持有锁的情况下,无法再次获得该锁。请确保锁的使用符合这一约束; -
默认超时时间
锁资源的默认超时时间为60秒。如果在超时时间内没有释放锁,锁将自动过期并被释放; -
节点故障与锁资源释放
如果锁持有的节点发生故障或宕机,锁资源的释放可能会延迟。这意味着,在锁资源未释放之前,其他节点无法获得该锁。此期间的分布式锁将无法被任何节点使用,直到故障节点恢复或锁被手动释放; -
PHP客户端的限制
目前,PHP客户端不具备类似于JavaRedisson
的自动监控机制,因此,PHP实现的分布式锁可能会面临锁超时后无法自动延长有效期的问题。我们也欢迎大家通过Pull Request参与贡献,帮助改进这一特性。
免责声明
在您的生产环境中使用本项目之前,请确保了解其工作原理,并在充分测试后再进行部署。我们不对因使用本项目造成的任何损失或故障负责。
贡献
欢迎通过 Issue 提交问题或 Pull Request 参与贡献