1 /**
2 * 短域名生成&解析类
3 */
4 class Build_URL {
5
6 private $mem;
7 private $base_url = 'http://xxx.com/';
8
9 public function __construct() {
10 $mem_conf = array(
11 array(
12 'host' => '192.168.10.90',
13 'port' => '11116'
14 ),
15 array(
16 'host' => '192.168.10.90',
17 'port' => '11117'
18 ),
19 );
20 $this->mem = new Memcache();
21 foreach ($mem_conf as $v) {
22 $this->mem->addServer($v['host'], $v['port']);
23 }
24 }
25
26 public function encode($url) {
27 $url = trim($url);
28 if(!preg_match("#^[http://|https://|ftp://]#iS", $url)) {
29 return false;
30 }
31 $md5 = md5($url);
32 $aid = $this->mem->get($md5);
33 if(!$aid) {
34 if(($aid = $this->mem->increment('auto_increment_id')) === false) {
35 $this->mem->set('auto_increment_id', 10000);
36 $aid = $this->mem->increment('auto_increment_id');
37 }
38 $this->mem->set($md5, $aid);
39 $key = $this->dec2any($aid);
40 $this->mem->set($key, $url);
41 } else {
42 $key = $this->dec2any($aid);
43 }
44
45 return $this->base_url.$key;
46 }
47
48 public function decode($url) {
49 $key = str_replace($this->base_url, '', trim($url));
50 return $this->mem->get($key);
51 }
52
53 private function dec2any($num, $base=62, $index=false) {
54 $out = '';
55 if (! $base ) {
56 $base = strlen($index);
57 } else if (! $index ) {
58 $index = substr("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ,0 ,$base);
59 }
60 $t = ($num == 0) ? 0 : floor(log10($num) / log10($base));
61 for ($t; $t >= 0; $t--) {
62 $a = floor($num / pow( $base, $t ));
63 $out = $out . substr($index, $a, 1);
64 $num = $num - ($a * pow( $base, $t ));
65 }
66 return $out;
67 }
68 }
69
70 $app = new Build_URL();
71 $url = array(
72 'http://www.baidu.com',
73 'http://www.google.com',
74 'http://edu.cnblogs.com'
75 );
76 foreach ($url as $v) {
77 $sort = $app->encode($v);
78 echo "sort link: ".$sort."\n";
79 $original = $app->decode($sort);
80 echo "original: ".$original."\n";
81 }
82 ?>