前段时间对短域名做了点小研究,其实大体上无非是用更大的进制来对10进制数值进行缩短,并存入一个kvdb中,到时候直接提取即可。
这里我使用的是Tokyo Tyrant,不了解这个玩意儿的,可以自行google,你可以把它当成memcached来使用就行了。
以下是我的代码。注意,这里我没有考虑Tokyo Tyrant宕机的问题,各位可以自行研究怎么来做。
<?php /** * 短域名生成&解析类 * @author 废墟 <[email protected]> * @version 1.0 2011-5-12 */ class Sort_URL { private $mem; private $base_url = 'https://anerg.com/'; public function __construct() { $mem_conf = array( array( 'host' => '192.168.10.90', 'port' => '11116' ), array( 'host' => '192.168.10.90', 'port' => '11117' ), ); $this->mem = new Memcache(); foreach ($mem_conf as $v) { $this->mem->addServer($v['host'], $v['port']); } } public function encode($url) { $url = trim($url); if(!preg_match("#^[http://|https://|ftp://]#iS", $url)) { return false; } $md5 = md5($url); $aid = $this->mem->get($md5); if(!$aid) { if(($aid = $this->mem->increment('auto_increment_id')) === false) { $this->mem->set('auto_increment_id', 10000); $aid = $this->mem->increment('auto_increment_id'); } $this->mem->set($md5, $aid); $key = $this->dec2any($aid); $this->mem->set($key, $url); } else { $key = $this->dec2any($aid); } return $this->base_url.$key; } public function decode($url) { $key = str_replace($this->base_url, '', trim($url)); return $this->mem->get($key); } private function dec2any($num, $base=62, $index=false) { $out = ''; if (! $base ) { $base = strlen($index); } else if (! $index ) { $index = substr("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ,0 ,$base); } $t = ($num == 0) ? 0 : floor(log10($num) / log10($base)); for ($t; $t >= 0; $t--) { $a = floor($num / pow( $base, $t )); $out = $out . substr($index, $a, 1); $num = $num - ($a * pow( $base, $t )); } return $out; } } $app = new Sort_URL(); $url = array( 'http://www.iciba.com', 'http://www.hp009.com', 'http://edu.hp009.com', 'http://doc.hp009.com', 'http://news.edu.hp009.com/2011/0512/1532639.shtml' ); foreach ($url as $v) { $sort = $app->encode($v); echo "sort link: ".$sort."\n"; $original = $app->decode($sort); echo "original: ".$original."\n"; } ?>
上面的代码将输出
sort link: https://anerg.com/2Bj original: http://www.iciba.com sort link: https://anerg.com/2Bk original: http://www.hp009.com sort link: https://anerg.com/2Bl original: http://edu.hp009.com sort link: https://anerg.com/2Bm original: http://doc.hp009.com sort link: https://anerg.com/2Bo original: http://news.edu.hp009.com/2011/0512/1532639.shtml