PHP · 2011年5月18日 0

关于短域名的那点事。。

前段时间对短域名做了点小研究,其实大体上无非是用更大的进制来对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