短网址项目概述

1.短网址项目,是将给定的长网址,转换成短网址。

如 新浪 http://t.cn/zQd5NPw ,其中zQd5NPw就是短网址

前段页面如下

我们在文本框中输入一个网址,点击生成短网址,系统就去mongodb中查,如果查得到,就直接返回短网址,如果查不到,就计算出短网址,并且加入到mongodb中,再返回短网址,给前端页面。

2.点击短网址 跳转到原有网站

 

短网址项目开发准备

公关点:

  1. 短网址和原有网址的映射关系

  形如d.cn/acF54Và解析到某一个固定的页面上

  解决:在apache中用URL重写,在nginx中用location

  2. 如何生成短网址,如zQd5NPw

  分析:

    2.1短

    2.2为公众服务,存储的网址特别多

    注:a、b两条是矛盾的,短自然存储的就少,所以要合理的设计短网址的组成规律

    解决:请看短网址生成办法(62进制数)

  3. 如何跳转

  302跳转

 

短网址生成办法

我们为每一个网址,指定一个序号,该序号是该网址被加到数据库的顺序。有一个全局的递增数据,来存储当前共有多少个网址被转换成短网址,并且被加入到数据库中。我们把该序号转换成62进制数,转换成的62进制数就是短网址。62进制数是由[a-zA-Z0-9]打乱之后表示的。

  1.  用a-z,A-Z,0-9,打乱之后,共62位,组成62进制的数

7位可以存储62^7,大约存储4万亿条数据

  1. 链接编码看起来”无规律一些”

====>十进制的URL的id转换为62进制

 

在mongodb中如何生成一个不断递增的数据

就像mysql中的increment,redis中的incr,oracle中的sequence

通过db.collection.findAndModify();

我们需要两个表,一个用来存储短网址和长网址的映射,取名为url,一个全局的序号生成器,取名为globalsn。

mongodb建模

库:info

表:url

文档的格式:

{_id:xxxx,sn:62进制数,oriurl:http://www.baidu.com,hits:0}

我们需要给url表添加唯一索引,因为我们的短网址,在表中存储一条就够了。

全局的序号生成器

库:info

表:globalsn

{_id:1,sn:0}

 

 

生成界面

 

url表

 

 

nginx做如下修改

 

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
<head>
<title>新建网页</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="description" content="" />
<meta name="keywords" contend="" />
<script type="text/javascript" src="http://libs.baidu.com/jquery/1.8.2/jquery.min.js"></script>
<script type="text/javascript">
    $(function (){
        $('#subm').click(function(){
            var oriurl=$('#ori').val();
            if(oriurl==''){
                alert('请输入网址!')
                return;
            }
            $.post(
                '/api.php',
                {'oriurl':oriurl},
                function(msg){
                    //alert('short url is'+msg);
                    $('#msg').html('短网址:'+'http://d.cn/'+url);
                }
            );
        })
    });
</script>
<style type="text/css">
    div{
        width:800px;
        margin:0 auto;
    }
    #ori{
        width: 500px;
        height: 40px;
        font-size: 36px;
    }
    #subm{
        width: 200px;
        height: 40px;
        font-size: 36px;
    }
</style>
</head>
<body>
    <div>
        <h1>mongodb短网址生成</h1>
        <input id="ori" type="text" name="oriurl"></input>
        <input id="subm" type="submit" value="生成短网址"></input>
        <div id="msg"></div>
    </div>
</body>
</html>

 

<?php
require('./url.class.php');
$url = new url();
$oriurl = $_POST['oriurl'];
$short = $url->addUrl($    oriurl)
echo $short;

 

 

<?php
class url{
    public function __construct(){
        $mongoClient = new mongoCLient(‘mongodb://..’);
        //选择test库
        $this->mongodb=$mongoClient->test;
    }
    //trans函数功能,把任意一个整数,转化成自定义的62进制
    //62进制规则表,在table中
    public function trans($num){
        $res=’’;
        while($num>62){
            $res=$this->table[($num%62)].$res;
            $num=floor($num/62);
        }
        if($num>0){
            $res=$this->table[$num].$res;
        }
        return $res;
    }
    public function getSn(){
        $cnt = $this->mongodb->selectCollection(‘cnt’);
        $seq = $cnt->findAndModify(array(‘_id’=>1),array(‘$inc’=>array(‘sn’=>1)));
        return (int)$seq[‘sn’];
    }
    public function getId($ori){
        $url = $this->mongodb->selectCollection('url');
        $row = $url->findOne(array('url'=>$ori),array('_id'=>1));
        return $row;
    }
    public function getUrl($id){
        $url=$this-mongodb->selectCollection('url');
        $row=$url-fineOne(array('_id'=>$id),array('url'=>1));
        return $row;
    }
    public function inchits($id){
        $url=$this->mongodb->selectCollection('url');
        $url->update(array('_id'=>$id),array('$inc'=>array('hits'=>1)));
    }
    public function addUrl($oriurl){
        $sn=$this->getSn();
        $sn=$this->trans($sn);
        $row=array(‘_id’=>$sn,’url’=>$oriurl);
        //选择表url
        $url=$this->mongodb->selectCollection(‘url’);
        //插入记录
        $url->insert($row);
        return $sn;
        //print_r($row);
    }


}

 

<?php
//print_r($_GET)
require(./url.class.php);

$id=$_GET['id'];

$url=new url();
$row=$url->getUrl($id);

if(empty($row)){
    echo 'err address!'
    exit;
}
$url->inchits($id);
//302跳转
header('Location: '.$row['url'],302);

 

posted on 2016-10-13 14:59  Mr.He多多指教  阅读(688)  评论(0)    收藏  举报