PHP阻塞锁和非阻塞锁机制 YurunLock

码农软件 · 软件分类 · 常用工具包 · 2019-08-13 13:13:11

软件介绍

YurunLock

PHP阻塞锁和非阻塞锁机制,内置解决并发锁重复执行的方案。目前支持文件、Redis、Memcache、Memcached。

composer安装

在你项目中的 composer.json 文件中加入下面的内容

{
    "require": {
        "yurunsoft/yurun-lock": "dev-master"
    }
}

中国用户如果使用composer很卡,请查看:https://pkg.phpcomposer.com/

代码用法

文件锁

<?php
$lock = new \Yurun\Until\Lock\File('我是锁名称');

$lock->lock(); // 阻塞锁
// TODO:在这里做你的一些事情
$lock->unlock(); // 解锁

// 带回调的阻塞锁,防止并发锁处理重复执行
result = $lock->lock(
    function(){
        // TODO:在这里做你的加锁后处理的任务

    },
    function(){
        // 判断是否其它并发已经处理过任务
        return false;
    }
);
switch($result)
{
    case LockConst::LOCK_RESULT_CONCURRENT_COMPLETE:
        // 其它请求已处理
        break;
    case LockConst::LOCK_RESULT_CONCURRENT_UNTREATED:
        // 在当前请求处理
        break;
    case LockConst::LOCK_RESULT_FAIL:
        // 获取锁失败
        break;
}

// 不阻塞锁,获取锁失败就返回false
if($lock->unblockLock())
{
    // TODO:在这里做你的一些事情
}
else
{
    // 获取锁失败
}

redis/memcache/memcached锁

<?php
$lock = new \Yurun\Until\Lock\Redis(    // 可以把Redis替换成Memcache/Memcached,下面代码用法相同
    '我是锁名称',
    array(
        'host'      =>  '127.0.0.1',
        'port'      =>  11211,
        'timeout'   =>  0,
        'pconnect'  =>  false,
    ), // 连接配置,留空则为默认值
    0, // 获得锁等待超时时间,单位:毫秒,0为不限制,留空则为默认值
    1, // 获得锁每次尝试间隔,单位:毫秒,留空则为默认值
    3, // 锁超时时间,单位:秒,留空则为默认值
);

$lock->lock(); // 阻塞锁
// TODO:在这里做你的一些事情
$lock->unlock(); // 解锁

// 带回调的阻塞锁,防止并发锁处理重复执行
result = $lock->lock(
    function(){
        // TODO:在这里做你的加锁后处理的任务

    },
    function(){
        // 判断是否其它并发已经处理过任务
        return false;
    }
);
switch($result)
{
    case LockConst::LOCK_RESULT_CONCURRENT_COMPLETE:
        // 其它请求已处理
        break;
    case LockConst::LOCK_RESULT_CONCURRENT_UNTREATED:
        // 在当前请求处理
        break;
    case LockConst::LOCK_RESULT_FAIL:
        // 获取锁失败
        break;
}

// 不阻塞锁,获取锁失败就返回false
if($lock->unblockLock())
{
    // TODO:在这里做你的一些事情
}
else
{
    // 获取锁失败
}

直接传入操作对象

直接传入操作对象支持文件、redis、memcache、memcached。可以防止重复实例化对象,造成内存和网络负担。

// 文件
$fp = fopen('1.txt', 'w+');
$lock = new \Yurun\Until\Lock\File('我是锁名称', $fp);
$lock->lock();
// 做一些事情
$lock->unlock();
fclose($fp);

// redis、memcache、memcached同理
$redis = new \Redis;
$redis->connect($host, $port, $timeout);
$lock = new \Yurun\Until\Lock\Redis('我是锁名称', $$redis);
$lock->lock();
// 做一些事情
$lock->unlock();
redis->close();

本文地址:https://www.codercto.com/soft/d/12273.html

与机器赛跑

与机器赛跑

[美]埃里克·布林约尔松(Erik Brynjolfsson)、[美]安德鲁·麦卡菲(Andrew McAfee) / 闾佳 / 2013-1-20 / 6.00

一场数字革命正在加速进行。 一些科幻小说里的场景已经在现实中发生:无人驾驶汽车开上了公路;智能设备能高效地翻译人类语言;人工智能系统在智力竞赛里击败了所有人类选手;工厂雇主开始购买更多的新机器,却不招新工人…… 这些例子都证明,数字技术正在快速地掌握原本只属于人类的技能,并深刻地影响了经济。虽然大多数影响是积极的:数字革新将提高效率、降低商品价格(甚至到免费),以及增加经济总量。 ......一起来看看 《与机器赛跑》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具