作者:绿茵汗将
发布时间:June 5, 2009
分类:PHP
No Comments
原理
在Linux文件系统中,一个用户对文件或目录所拥有的权限分为三种:"可读"、"可写"和"可执行",分别用 1 、2 和 4 来表示,它们之间可以任意组合:有“可读”、“可写”权限就用 3 来表示(1 + 2 = 3);有”可读“、”可执行“权限就用5来表示(1 + 4 = 5),三种权限全部拥有就用 7 表示(1 + 2 + 4 = 7)。
实际上,这种运算是基于二进制的。
假设可执行、可写、可读三种权限分别对应三个状态位,如果用户具有某种权限,那么将对应的状态位标识为“1”,反之则标识为“0”。如图:
如果只有“可读”权限,那么就对应二进制数:001,将这个二进制数转成十进制就得到1;如果同时具有“可读”、“可写”权限,二进制数则对应为: 011,转十进制得:3;同理,三种权限都有的,十进制就等于7。
实现
在PHP中,通过位运算符很容易就可以做到类似的权限控制:
<?php
//定义权限
define('READ', 1<< 0); // 把可读权限放在最右边
define('WRITE', 1<<1); // 可读权限向左移一位
define('EXCUTE', 1<<2); // 可执行权限向左移两位
//赋予权限
$user_permission = READ | WRITE;
//验证权限
echo '可读:', ($user_permission & READ) ? 'Yes' : 'No', "\n";
echo '可写:', ($user_permission & WRITE) ? 'Yes' : 'No', "\n";
echo '可执行:', ($user_permission & EXCUTE) ? 'Yes' : 'No', "\n";
?>
PHP语言本身的错误控制 也是用位运算来做的,它甚至还利用了按位异或和按位非,使得错误控制更加精确。
优点和缺陷
位运算的运算对象是二进制的位,速度快,效率高,而且节省存储空间,位运算做权限控制又相当地灵活。但是,位运算也有很大的局限,因为在32位计算机上,位移不能超过32次,这就要求权限数量不超过32种。
延伸阅读:
- MySQL的SET类型,也是基于位运算的,恰当的运用,效果不错,可以参看教程
广告
作者:绿茵汗将
发布时间:June 4, 2009
分类:Linux,架构
No Comments
前段时间买了一个VPS主机用来练手,这段时间又在找工作,随手就把简历放到VPS上。因为是练手的,所以VPS不断被我摧残,结果造成简历经常打不开,为避免用人单位打不开简历而再一次的对我能力表示鄙视,于是考虑增加了失败接管机制。
架构图:
分解:
简而言之,整个过程就是在监控VPS状态,修改域名指向。
监控主机:
UnixCenter即扮演监控主机的角色,负责动态域名的解析调控。
实现方式是通过cron每5分钟去调用cURL检查VPS是否存活,一旦监控到VPS主机不存活,即透过3322 API 控制动态域名指向虚拟主机。
具体代码:
#!/bin/sh
USER='user'
PASS='******'
DOMAIN='vip.3322.org'
VPS_IP='74.1.1.1'
HOST_IP='58.1.1.1'
#通过3322API更新域名的指向
update_3322() {
echo "Will change $DOMAIN ip to $1"
/usr/local/bin/curl -m 30 --retry 5 --retry-delay 5 -s "http://{USER}:{PASS}@members.3322.org/dyndns/update?system=dyndns&hostname={$DOMAIN}&myip={$1}&wildcard=OFF" && echo "Done" && exit 0
}
#使域名指向VPS
redirect_to_vps() {
echo -n "Redirect to VPS..."
# 通过nslookup检查域名的目前指向,如果已经是vps,则不动作。
[ `/usr/bin/nslookup $DOMAIN | grep Address | tail -n 1 | awk '{print $2}'` = $HOST_IP ] && update_3322 $VPS_IP || echo "Already is"
exit 0
}
#使域名指向虚拟主机
redirect_to_host() {
echo -n "Redirect to HOST..."
# 通过nslookup检查域名的目前指向,如果已经是虚拟主机,则不动作。
[ `/usr/bin/nslookup $DOMAIN | grep Address | tail -n 1 | awk '{print $2}'` = $VPS_IP ] && update_3322 $HOST_IP || echo "Already is."
exit 0
}
[ `/usr/local/bin/curl -m 30 --retry 2 --retry-delay 10 http://$VPS_IP/is_alive -s || echo "NOT_OK"` = "OK" ] && redirect_to_vps || redirect_to_host
3322和DNS服务商:
DNS服务商负责将网站的域名通过cname的方式指向3322动态域名,而动态域名负责指到RealServer。
3322这个环节是可以省略的,直接到DNS服务商(如DNSPod)处修改域名的指向也未尝不可,只是要注意将ttl时间设短一些。但是出于保护域名管理密码的目的,我才绕道3322,因为即便是UnixCenter有安全漏洞遭到不测,黑客也只能获取到我的3322管理密码,一方面其只能控制一个域名,网站的其它子域名不受影响;另一方面我还可以通过域名管理密码轻易的绕过3322,使域名不至于被挟持。
RealServer:
VPS和虚拟主机不是互备的关系,是主备关系——以VPS为主,虚拟主机为备,VPS优先级高于虚拟主机,所以当VPS故障排除并恢复的时候,域名指向就会切回VPS,而不是等待虚拟主机发生故障的时候再切回VPS。
PS. 这种架构纯属个人娱乐,并不具商业应用价值,仅供学习和娱乐。
延伸阅读:
作者:绿茵汗将
发布时间:May 31, 2009
分类:MySQL
No Comments
Google Analytics的ID一般形如:UA-18xxxxx-1,UA-18xxxxx-4,我们可以将它分成两段来看:字段1:UA-18XXXXX是指帐户的ID;字段2:字段1后附加的1、4,刚分别是指该帐户名下的两个网站。
过去心里总是纳闷这种ID如何产生,以为要用一个新的字段来记录字段2的最大值。最近查阅到Mysql手册才恍然,原来Mysql原生就很好的支持了这种附加自动增长字段的复合主键,所以字段2是自动计算出来的,不需要添加字段。计算方式:MAX(auto_increment_column) + 1 WHERE prefix=given-prefix [1]。
不多说,直接看SQL:
mysql> CREATE TABLE `_test` (
-> `c1` varchar(20) NOT NULL DEFAULT '',
-> `c2` int(11) NOT NULL AUTO_INCREMENT,
-> `c3` varchar(255) ,
-> PRIMARY KEY (`c1`,`c2`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `_test` (`c1`,`c3`) VALUES ('UA-18xxxxx','Robin Home'),
-> ('UA-18xxxxx','Robin Blog'),
-> ('UA-18xxxxx','Robin Resume');
Query OK, 3 row affected (0.00 sec)
mysql> SELECT * FROM `_test`;
+---------------+----+------------------+
| c1 | c2 | c3 |
+---------------+----+------------------+
| UA-18xxxxx | 1 | Robin Home |
| UA-18xxxxx | 2 | Robin Blog |
| UA-18xxxxx | 3 | Robin Resume |
+---------------+----+------------------+
3 rows in set (0.00 sec)
值得注意的是,MySQL的这种特性只适用于MyISAM和BDB引擎。
作者:绿茵汗将
发布时间:May 28, 2009
分类:其它
No Comments
正则表达式
VIM的正则表达式风格似乎是一种特有的风格,与POSIX正则和 PCRE 虽然大同小异,不过我还是经常被这种山寨的正则搞的晕头转向,好记忆不如烂笔头,咱就把它记下吧:
- 非贪婪模式:贪婪模式用’*',非贪婪模式就用’\{-}’
- 全字匹配:\< 匹配单词词首,\> 匹配单词词尾
- 多行匹配:“\_.”匹配任意单个字符和换行符,这样就可以匹配多行了
所以,如果要删除PHP的多行注释,可以先 :%s/\/\*\_.\{-}\*\///g将注释替换成一个空行,再用:g/^\s*$/d把空行删除。
再免费附赠一句用来清除以"#"开头的注释::g/^#/d
作者:绿茵汗将
发布时间:May 28, 2009
分类:非技术
2 Comments
博客又一次Reload了!!
是的,我也已经不知道这是第几次Reload了!!希望这次可以坚持下来!
这回不用 WP ,也不用 MT 了,虽然这两个功能都很弓虽大,但是,过了过了。这次用国货——Typecho,土生土长的哦,选择它的原因只有一个:简单!
用Typecho辅以自制的Markdown插件。说是博客,其实我更愿意当它是Wiki啦。而且也确实预计未来可能会按Twiki的样式改一改模板。
- 页码:
- 1