libratechie/think-distributed-lock

一个专为 ThinkPHP 框架设计的轻量级分布式锁组件,帮助开发者轻松实现高并发场景下的资源互斥访问

v1.0.0 2025-02-05 09:10 UTC

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);
    }
}

注意事项

  1. 异常处理
    确保在 try-catch 块中进行业务操作,避免异常导致锁无法释放;

  2. 不可重入锁
    本项目当前不支持可重入锁机制。即同一线程在持有锁的情况下,无法再次获得该锁。请确保锁的使用符合这一约束;

  3. 默认超时时间
    锁资源的默认超时时间为60秒。如果在超时时间内没有释放锁,锁将自动过期并被释放;

  4. 节点故障与锁资源释放
    如果锁持有的节点发生故障或宕机,锁资源的释放可能会延迟。这意味着,在锁资源未释放之前,其他节点无法获得该锁。此期间的分布式锁将无法被任何节点使用,直到故障节点恢复或锁被手动释放;

  5. PHP客户端的限制
    目前,PHP客户端不具备类似于Java Redisson的自动监控机制,因此,PHP实现的分布式锁可能会面临锁超时后无法自动延长有效期的问题。我们也欢迎大家通过Pull Request参与贡献,帮助改进这一特性。

免责声明

在您的生产环境中使用本项目之前,请确保了解其工作原理,并在充分测试后再进行部署。我们不对因使用本项目造成的任何损失或故障负责。

贡献

欢迎通过 Issue 提交问题或 Pull Request 参与贡献