discuz_process初探

来源:互联网 发布:linux开端口命令 编辑:程序博客网 时间:2024/06/09 17:46

在discuz中,自带一个程序锁类,就是discuz_process。这里的程序可以是任意的,也就是起到一个标志的作用。用三种方式存放锁的状态:静态变量锁、内存锁和数据库锁。

首先来看下获取锁的方法:

public static function islocked($process, $ttl = 0) {
$ttl = $ttl < 1 ? 600 : intval($ttl);
return discuz_process::_status('get', $process) || discuz_process::_find($process, $ttl);
}

这里返回的是目前$process目前是否加锁。依据_status返回的静态变量锁和_find返回的内存/数据库锁取或。

再看一下_status方法:

private static function _status($action, $process) {
static $plist = array();
switch ($action) {
case 'set' : $plist[$process] = true; break;
case 'get' : return !empty($plist[$process]); break;
case 'rm' : $plist[$process] = null; break;
case 'clear' : $plist = array(); break;
}
return true;
}

这个方法比较简单,就是声明了一个静态数组,并且用$process作为key来控制锁的状态。

再看_find方法:

private static function _find($name, $ttl) {


if(!discuz_process::_cmd('get', $name)) {
discuz_process::_cmd('set', $name, $ttl);
$ret = false;
} else {
$ret = true;
}
discuz_process::_status('set', $name);
return $ret;
}

这里稍微复杂,牵涉到_cmd方法,_cmd如下:

function _cmd($cmd, $name, $ttl = 0) {
static $allowmem;
if($allowmem === null) {
$allowmem = memory('check') == 'memcache';
}
if($allowmem) {
return discuz_process::_process_cmd_memory($cmd, $name, $ttl);
} else {
return discuz_process::_process_cmd_db($cmd, $name, $ttl);
}
}

分析代码可以看出,_cmd方法主要就是通过判断是否启用内存缓存,来决定是从内存缓存,还是从数据库中读取锁状态,知道了这个,再回到_find方法中,如果没有读取到锁状态,那么在内存缓存/数据库中加锁(discuz_process::_cmd('set', $name, $ttl)),返回false,否则返回true。无论返回何值,都对对静态变量加锁(discuz_process::_status('set', $name);)。

最后unlock方法:

public static function unlock($process) {
discuz_process::_status('rm', $process);
discuz_process::_cmd('rm', $process);
}

很简单,对静态变量、内存缓存/数据库都释放锁。

0 0
原创粉丝点击