YurunLock PHP阻塞锁和非阻塞锁机制开源项目

我要开发同款
匿名用户2017年08月08日
42阅读
开发技术PHP
所属分类程序开发、常用工具包
授权协议MIT

作品详情

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;}// 不阻塞锁,获取锁失败就返回falseif($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;}// 不阻塞锁,获取锁失败就返回falseif($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();
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论