最新赞助活动温馨提示:自愿赞助服务器费用,学生和没有工作的整站资源免费下载!
头像

PHP阻塞锁和非阻塞锁机制,内置解决并发锁重复执行的方案

来源:http://erdangjiade.com/php/5319.html 沐浴春风 2017-08-07 15:44浏览(2089)

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

0、请不要问“在不在”之类的问题,有问题直接问!1、学生或暂时没有工作的童鞋,整站资源免费下载!2、¥9.9充值终身VIP会员,加我微信,826096331 拉你进VIP群学习!3、程序员加油,技术改变世界。 在线 充值

PHP阻塞锁和非阻塞锁机制,内置解决并发锁重复执行的方案
分类:PHP > 其他 难易:高级
查看演示 下载资源:

加我微信,拉你进VIP群学习:

下载资源 下载积分: 80 积分

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

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();
声明:本文为原创文章,如需转载,请注明来源erdangjiade.com并保留原文链接:https://www.erdangjiade.com/php/5319.html
评论8
头像

友情提示:垃圾评论一律封号 加我微信:826096331拉你进VIP群学习群

  • 头像 7楼
    04-26 17:00
    ngu137
    好东西 知道收藏起来啊 啊。。。
  • 头像 6楼
    01-18 17:37
    nbspnbsp
    这个是好东东,,好东东。。
  • 头像 5楼
    11-20 00:10
    udeyst
    这个不错哦……
  • 头像 4楼
    09-28 11:51
    qq562140910
    学习,给我涨点积分
  • 头像 3楼
    09-23 09:25
    小张111
    学习,学习,给我涨点积分吧
  • 头像 板凳
    08-21 01:18
    2233725757@qq.com
    我只想说这个网站真不错,我要下载了
  • 头像 椅子
    08-17 10:16
    qq562140910
    学习加积分~
  • 头像 沙发
    08-09 11:58
    qq562140910
    学习,学习~~
1 2