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);
}
很简单,对静态变量、内存缓存/数据库都释放锁。
- discuz_process初探
- DISCUZX2.0 核心文件 class_core.php 分析之 – discuz_process
- Discuz!开发之进程锁类discuz_process介绍
- 初探
- 初探PHP5
- jdbc初探......
- STL初探
- HiveMind初探
- 初探人工智能
- 初探人工智能
- SQLDMO初探
- 初探maven
- Hibernate初探
- COM初探
- 初探RMI
- Ajax初探
- HiveMind初探
- 初探JFreeChart
- 网络基本功(五):细说路由(下)
- java 九九乘法表算法题
- RGB颜色与16进制颜色的换算方法
- 一定要弄懂GetMemory
- 十大Intellij IDEA快捷键
- discuz_process初探
- Java中length,length(),size()区别?
- RHEL6.6环境下搭建本地yum源(Nginx版)
- shutdown函数
- 关于java方法的定义
- app弱网络测试
- arp用途-已知IP查看MAC
- NFC之让Android自动运行程序
- Java 深复制,浅复制