isszz/think-lock

thinkphp6+ lock based on symfony lock

v0.0.1 2023-07-16 17:56 UTC

This package is auto-updated.

Last update: 2024-10-27 06:39:09 UTC


README

thinkphp6+ lock based on symfony lock

Minimum PHP Version Minimum Thinkphp Version Stable Version Total Downloads License

安装

composer require isszz/think-lock

说明

目前支持 FileRedisPDO驱动,安装后可在config/locker.php配置。 建议使用Redis或者PDO驱动

配置

<?php

return [
    'driver' => 'redis', // file|redis|pdo,建议使用redi或pdo,file不支持ttl
    'drivers' => [
        'file' => [
            'path' => runtime_path('lock'), // 锁存储路径
        ],
        // 未配置时使用tp缓存类的redis,如果是默认配置且在同一个库建议留空
        'redis' => [
            'host'       => '127.0.0.1',
            'port'       => 6379,
            'password'   => '',
            'select'     => 0,
        ],
        // 使用pdo驱动时,数据库表和字段是自动创建无需自行处理
        'pdo' => [
            // 获取thinkphp的数据库配置
            'database' => config('database.connections.'. config('database.default', 'mysql')),
            // 自行设置数据库配置
            /*
            'database' => [
                // 必须配置的参数
                'database' => '', // 数据库
                'password' => '', // 数据库密码
                // 可选配置参数
                'username' => 'root',
                'hostname' => '127.0.0.1',
                'hostport' => '3306',
                'charset' => 'utf8mb4',
                'prefix' => '', // 表前缀
            ],
            */

            // 如果表名, 和字段需要自定义, 则在这里配置
            /*
            'table' => 'lock_keys', // 表名
            'id' => 'key_id', // 锁ID
            'token' => 'key_token', // 锁token
            'expiration' => 'key_expiration', // 锁有效期
            */
        ],
    ],
    
    'ttl' => 300, // 默认锁超时时间
    'auto_release' => true, // 是否自动释放,建议设置为 true
    'prefix' => 'think_lock_', // 锁key前缀
];

使用

facade方式

use think\lock\facade\Locker;

class Index
{
    public function add()
    {
        $locker = Locker::lock('test', ttl: 5);

        if (!$locker->acquire()) {
            return json(['code' => 1, 'msg' => '操作太频繁,请稍后再试']);
        }

        try {
            sleep(5);
            // 具体的操作代码
            return json(['code' => 0, 'msg' => '进行了一些操作']);
        } finally {
            // 解锁
            $locker->release();
        }

        return json(['code' => 0, 'msg' => 'success']);
    }
}

依赖注入方式

use think\lock\Locker;

class Index
{
    public function add(Locker $locker)
    {
        $locker = $locker->lock('test', ttl: 5);

        // ...
    }
}

更多操作参考 symfony/lock 文档

https://symfony.com/doc/current/components/lock.html